ピンポイントですごく役に立ったのでメモ
唯一の開発環境であるSolaris8上のOracle9iで、何年も誰もメンテしていないどころか、そもそも正しくインストールできているのか怪しい状況の中で、だましだまし使ってきたが、expが動かない。
ダメもとで以下のページを試してみたら、とてもうまくいった。
http://sakochin3.blog.so-net.ne.jp/2007-07-14
要約すると,DB作成時のバージョンと現オラクルのバージョンが異なる場合
(もしくは必ず実行する必要がある)
catexp.sql catalog.sql などのsqlを流すことで解決するらしい.
※sysでログイン後,流した.但し,現在どういう場合にどのsqlを流せばよいのかは不明
1つ流してexp実行を繰り返したところcatexp.sql catalog.sql catproc.sqlここまで流してエクスポートが出来るようになるらしい.※下に追記あり
感激したのでメモ。
また、sysユーザのストアドまわりが軒並みinvalidで全部コンパイルしなおす必要があるのかとゾッとしたが、
http://www.drk7.jp/MT/archives/001452.html
のPL/SQLを参考に自動で、プロシージャ・ファンクション・パッケージ・トリガーまわりを一括してコンパイルすることができた。*1
SET SERVEROUTPUT ON SIZE 1000000 BEGIN FOR cur_rec IN ( SELECT OBJECT_NAME, OBJECT_TYPE, DECODE(OBJECT_TYPE, 'PACKAGE', 1, 'PACKAGE BODY', 2, 2) AS RECOMPILE_ORDER FROM USER_OBJECTS WHERE OBJECT_TYPE IN ('PACKAGE', 'PACKAGE BODY') AND STATUS = 'INVALID' ORDER BY 3 ) LOOP BEGIN IF cur_rec.object_type = 'PACKAGE BODY' THEN EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.object_name || '" COMPILE BODY'; ElSE EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || ' "' || cur_rec.object_name || '" COMPILE'; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.object_name); END; END LOOP; END; /ちなみに、上記 SQL では以下のような SQL を自動的に発行してくれています。もちろん手動で下記のコマンドを実行してもOKです。
ALTER VIEW COMPILE; ALTER FUNCTION COMPILE; ALTER PROCEDURE COMPILE; ALTER PACKAGE COMPILE; ALTER PACKAGE COMPILE BODY; ALTER TRIGGER COMPILE;最後に USER_OBJECTS のステータスを確認しておく。STATUS が全て VALID になっていたらOK!
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS;
感激したのでメモ。
*1:例は、パッケージだけだが、よくできたコードで、「FUNCTION」「PRODECURE」「TIGGER」を検索条件に加えるだけでOKだった。