seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

ピンポイントですごく役に立ったのでメモ

唯一の開発環境である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

ここまで流してエクスポートが出来るようになるらしい.※下に追記あり

参考:sqlファイルの場所.
C:\oracle\product\9.1.0\Db_1\rdbms\admin

感激したのでメモ。


また、sysユーザのストアドまわりが軒並みinvalidで全部コンパイルしなおす必要があるのかとゾッとしたが、

http://www.drk7.jp/MT/archives/001452.html

PL/SQLを参考に自動で、プロシージャ・ファンクション・パッケージ・トリガーまわりを一括してコンパイルすることができた。*1

(drk7.jpさんのところから引用)

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だった。