月曜日, 2月 15, 2010

Oracle9iのDBMS_METADATA.GET_DDLを使ってTABLE,INDEX,TRIGER,COMMENTを取得する

かなり久々、別に放置していた訳じゃないです。
仕事の都合で、現在の開発環境に定義されているDDLスクリプトを抜き出す必要があったので、DBMS_METADATAパッケージを使用してみた。

前に(言っても2年くらい前)DB2で同じようなことをやった時にはdb2lookupっていうコマンドが用意されていたので、かなり簡単にできたんだけど。。。
DBMS_METADATAパッケージって何ていうか癖があるような気がした。

私が欲しいのは
  • 1.そのまま取得結果が実行できる(実行環境はsql*plusや他のサードパティ製ツール)
  • 2.テーブル定義なら合わせてINDEXやCOMMENTの情報も欲しい
  • 3.後々の保守も考えてテーブル単位にDDLをファイルに出力したい
で、結果としてこうなった
select
  DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME, OWNER)
from
  ALL_TABLES
where
  OWNER = :OWNER and
  TABLE_NAME = :NAME
union all
select
  DBMS_METADATA.GET_DEPENDENT_DDL('COMMENT', TABLE_NAME, OWNER)
from
  (select
     TABLE_NAME, OWNER
   from
     SYS.ALL_TAB_COMMENTS
   where
     OWNER = :OWNER and
     TABLE_NAME = :NAME and
     COMMENTS is not null
   union
   select
     TABLE_NAME, OWNER
   from
     ALL_COL_COMMENTS
   where
     OWNER = :OWNER and
     TABLE_NAME = :NAME and
     COMMENTS is not null)
union all
select
  DBMS_METADATA.GET_DEPENDENT_DDL('INDEX', TABLE_NAME, TABLE_OWNER)
from
  (select
     TABLE_NAME, TABLE_OWNER
   from
     ALL_INDEXES
   where
     TABLE_OWNER = :OWNER and
     TABLE_NAME = :NAME and
     INDEX_NAME not in (select CONSTRAINT_NAME from SYS.ALL_CONSTRAINTS
                        where TABLE_NAME = TABLE_NAME and
                              CONSTRAINT_TYPE = 'P') and
     UNIQUENESS != 'UNIQUE'
   group by TABLE_NAME, TABLE_OWNER)
union all
select
  DBMS_METADATA.GET_DDL('TRIGGER', TRIGGER_NAME, OWNER)
from
  ALL_TRIGGERS
where
  TABLE_OWNER = :OWNER and
  TABLE_NAME = :NAME
;
※ここでは1テーブルに対してのSQLにしてあります。 確かにこれで僕が欲しいスクリプトは取得可能なのだが、
私が求める要件1を満たさない。。。

セミコロンないしスラッシュがCOMMENT文に対して出力されない。。。

まあ、その問題もマニュアルを見ることで解消できた。
sql*plus上でこんな感じで実行すると私の欲しいスクリプトが出た。
set echo off
set termout off
set heading off
set pagesize 0
set linesize 10000
set trimout on
set trimspool on
set feedback off
set long 1048576
set longchunksize 1024

exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR', TRUE );

exec :NAME := 'テーブル名'
spool スプールログ名.sql
@↑のSQLファイル
spool off
肝だったのが、 DBMS_METADATA.SET_TRANSFORM_PARAMとlongchunksizeだった。 DBMS_METADATA.GET_DDLの実行結果はCLOBなので、longの設定はしていたのだけど、それだけだと特定の行サイズになると改行されてしまう。linesizeも設定してるんだけど改行されてしまう。。。
その状態を回避するのにlongchunksizeを使用した。 本来、CLOBに対してlong,longchunksizeはセットだと覚えておくと良いみたい。

セミコロンないしスラッシュがCOMMENT文に対して出力されない問題はDBMS_METADATA.SET_TRANSFORM_PARAMにSQLTERMINATORで幸せになれた。(しかし、何故にデフォルトでFalse設定なんだ??)
とりあえず、これでまとめて欲しいものを出力することができた。

日曜日, 12月 06, 2009

もう師走

早いもんだね。。。

プーしてたときには欠かさず毎日postしてたのに
今では月に一回ってところです。

できれば有意義な情報をpostしたいなぁ~と思えば思うほどキチンとまとめないと世間様に見せることもできないなんて思ってしまって。。。
と自分への言い訳はこの程度にして
まぁ、投稿してたものにしても世間様でお役に立っているのかどうか?と不安に思っていたんですが、

今日、珍しくコメントを頂いて
やっぱり、居たんだね私と同じことを思っていた人が!嬉しいですよ!!
やっぱり、有意義な事だけpostしようと思いつつ
こんなpostをしてる自分がちょっと情けない。。。

土曜日, 11月 14, 2009

OCaml まだ、読んでる途中

まだまだ、読んでる途中です。

かなりのんびり読んでます。
まぁ、通勤の電車の中と仕事場での昼休みに読んでるだけだからね。。。

でも、何かこうしっかり(?)書かれてたら、楽しく読めて良い感じだw。

しかし、読んでて気になったことが一点、

この本には各章にまとめとしての練習問題が含まれているのですが(もともと講義用のテキスト?がベースらしい)、何故か解答が付いてないように思える。

で、2週間くらい前に「何で解答例が付いてないんだ??」と考えてみて、自分なりに納得しようと解答がないという事実について答えを考えてみた。

答えを鵜呑みにして、理解ができてなかったら意味がない

うん、そういうことにしておこう。。。

と、してたんですが
先に進むほどに「結果としての答えも分かっているし、コードも書いて、動かした結果も想定どうり」で良かったねでは納得できなくなってきました。。。

これはOcamlの記述もとい、関数言語としての記述として妥当(一般的)か?
が気になって気になって。。。

同じ本を読んだ方で同じように悩んでいる方はいるのだろうか?

日曜日, 10月 25, 2009

超久々

何だかずいぶん久しぶりの投稿です。

まあ、特に大きなネタがあるわけではないんですが。。。

これまでにあった事といえば、
  • 自転車をバラして掃除
  • 仕事用の鞄を何年かぶりに買い替えた
  • ocamlを勉強し始めた
  • とりあえず、自分用の勤務時間とか記録するマクロ(Javascpit)をocamlに置き換えてみるのが当面の目標かな?
    ocamlは最初日本語のチュートリアルとか読んだ(というか一通りは読んではみた)が、やっぱり関数言語初心者(いまだにCommonLispも読めないし。。。)ということで、Amazonで本を買ってみた。

    まだ、3章のはじめくらいまでしか読んでないが、今のところは理解できていると自分では思ってる。。。
    しかし、テキストに練習問題が付いているのだが、オペレータ[**]の説明が無くいきなり問題で登場したので実行するまで理解できなかったのがショックだった。。。
    あとは再帰を使った簡単な関数を自分で書いてみて動かしたときの感覚が初めてプログラミングしたころの感覚みたいでちょっと気持ちよかった。

    たまにはいいよね

    日曜日, 8月 16, 2009

    Virtual Box+DropBoxでWindowsのスタンバイが実行できない(続き)

    Virtual Boxをインストールするとスタンバイにできないであれこれ書いたが、結局何かをインストール(Windows Updateも含む)が行われるとスタンバイにできないことがわかった。。。

    一応、DropBoxをExitで終了させればスタンバイにはできるんだけど
    それじゃ面倒すぎ

    ということで、VirtualBoxをアンインストール
    何か良い方法はないものかなぁ~
    ちなみにVirtualBoxをアンインストールするときもDropBoxを終了させないと正常に終了してくれないときたもんだ。。。
    なんでだろう。。。

    水曜日, 8月 12, 2009

    Virtual Boxをインストールするとスタンバイにできない

    かれこれ1ヶ月ぶりです。

    それもこれもなぁ~んもネタがなかったのが原因なんですけどね。

    で、今回は色々探してイマイチ見つからなかったものを

    まぁ、タイトルのとおりなんですが、Virtual Boxをインストールすると何でかWindowsのスタンバイが途中で止まっちゃうって現象について、私がやった対応?(対応というのもおこがましいが。。。)をご紹介

    とりあえず、ネットを探してるとこんなのが載ってた
    スタンバイモードに移行できない状況を解決できた、のか?
    紹介されている内容をもとに対応はしてみたが何が原因なのやら。。。

    一応、私の環境はこんなの
  • Windows XP sp3
  • VirtualBox-3.0.4-50677-Win.exeをインストール
  • どうやらまったく関係ないDrop boxが関係あるようだ
    ちなみにDrop boxのverは控えてなかった。。。
    で、どうやってスタンバイできるようにしたか
    Drop boxを再インストールする
    (ちなみにDropbox 0.6.507.exeをインストール)
    これだけw

    しかし、ネットワークアダプタ関連だとは思うが、正確な原因はわからず。。。
    とりあえず、当面はこの状態で問題がないことを祈ろう。

    土曜日, 7月 04, 2009

    やったことのない言語より問題なのは。。。

    新しい作業場に移り、早くも2週間

    今までJavaしかやってこなかった僕としては
    ASP(.netじゃないよ)なんてできるのか??といった不安はかなりあったが、意外と何とかなるもんだ。

    それよりも問題なことがある。

    それは、データベースだ!

    誰が設計したのかわからんが、何がしたいのかわからないテーブル設計が曲者だった。。。

    「1:1..nのテーブル構造だ」と説明を受けて、
    試しに主キー同士で結合するとデータが取得できない。。。「これって1:0..nじゃん」と突っ込みに行くと主キーでくっつけてはいけないとか。。。どっかに説明を書いといてくれ!
    これって正規化してこれなのかな??

    高いRDBを使ってこれなんて。。。
    postgreでもいいんじゃない?

    久々のPOSTは愚痴でした。。。

    failed to read qemu headerのときのメモ

    かなり久々。。。 忘れないようにここに書きこんでおく。 ちょっとした手違いで libvirtでイメージを起動しようとすると failed to read qemu header なんておっしゃられて起動しない。。。 vmwareserverを使って...