<概要>
某イントラシステム内のコンテンツ全部に新規でVIEWを作成する。
<流れ>
1、テキストにVIEW作成対象テーブルを書く
2、SQL*LOADERでテーブルに取込
3、メインプロシージャ実行でロードしたテーブル名をサブプロシージャに渡す
4、サブプロシージャでテーブルカラム名を取得しCREATE VIEW文を作成、テーブルにINSERTする
5、CREATE文の入ったテーブルを全件スプール
6、スプールファイルを実行しVIEW作成
終了
いろいろ戦った。
この流れを作る前に、当初4でテーブルにINSERTではなくCREATE文を発行したかった。
しかしプロシージャ内ではCREATE VIEWは発行できなかった。エラーメッセージから権限がありませんとあったのでEMからいじってみる。
この作成したプロシージャの権限かと思っていたが実はユーザーのシステム権限の付与で解決した。
しかしこの処理はワンショット。このためだけに本番EMにシステム権限を付与するのも手間だということで別の方法を模索した。
それがこの流れ。
たまたまログ用としてテーブルに出力していたところからファイルに出して実行すればできるのではと。
その中でも問題は多々あった。がすべて個別に解決できるものだった。
まず4でテーブルにCREATE文をINSERTする時に4000byte以上は入らずどうするか。
2カラムにわけてテーブルにINSERTする事で解決。5の出力時に結合すればいいなと。
で5の出力。SELECTの結果を出したのだが、その結果でもVARCHAR(4000)以上はエラーとなる。
そんなデータの出力はどうするか。。。
調べてみたらCLOB型で対応できそう。使ってみる。
SELECT TO_CLOB(”) || COL01 || COL02 || ‘;’ FROM TBL_NAME;
しかしうまくいかない。
#CLOBはspool前にset long 1000などと出力数を指定してください。
#デフォルトは80です。
とか他にPAGESIZEやLINESIZEなどいろいろ5のSET文を設定してためす。
で次、実際に実行しようとしたときにSQL*PLUSでは1行MAX2500byteとのことで、ファイルあるCREATE文は1行にずらっと書いてあったためエラーとなる。
⇒SP2-0027: 入力が長すぎます(> 2499文字)。この行は無視されました。
改行すれば問題なし。でファイル出力時にreplaceかけてみたがきれいでなかったので、4のINSERT時に改行コード(chr(13)||chr(10))も一緒に出力。
これでSQL*PLUSの桁の問題が解決。
しかしまだ続く、改行付きでSPOOLできたものの変なところにNULLの改行があってVIEWが作成されない。
これは SET LONGCHUNKSIZE の設定でなんとかなりそう。
SET LONGとあわせて設定し無駄な改行が詰められた。こんなの初めて。
これで上記の流れをバッチ化したものを実行したところすべてVIEWが作成された。