Tips14. Oracle内に格納されたソースコードの確認方法

Oracle での開発は、SQL, PL/SQL で行います。
これらはコンパイルされDBのリポジトリに保存されます。

データベースオブジェクトとしては、ビュー(view)、ストアドパッケージ/ストアドプロシージャ/になります。
それらの内容を確認する方法をいかに記します。

これらは、データディクショナリ中に格納されています。
データディクショナリと言っても、特別なオブジェクトではなく、テーブルにデータとして格納されているだけです。
ビューであれば user_views テーブル。
パッケージであれば、user_source テーブルに格納されます。

“user_"の部分は、参照可能な範囲と権限により"dba_","all_" の場合もあります。
他スキーマのオブジェクトも参照したい場合は “all_"、
DBA権限があり、システムオブジェクトを含めた全オブジェクトを参照したい場合は、"dba_"を参照します。

Viewのソースコード

まず、確認対象となるビューを作成します。
下記のSQLを実行します。

CREATE VIEW test_v
AS
SELECT e.empno, e.ename, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;

コンパイルされ、データディクショナリに保存されたビューのソースコードを確認するには、下記のSQLを実行します。

SELECT text
FROM user_views
WHERE view_name = 'TEST_V';

すると、次のような結果が返ってきます。

TEXT
“SELECT e.empno, e.ename, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno"

業務で使用する際に注意するのは、このtext列がLONG型であるということ。
SQL*Plusなどで実行する場合は、事前に

set longsize 65535

を行っておく必要があります。

複数行に渡るソースも含め、1行・1列の中にビューのSQLが丸ごと保存されています。

ストアド・パッケージ等のソースコード

次のPL/SQLを作成しておきます。

CREATE OR REPLACE PROCEDURE test_proc
IS
a, b NUMBER;
BEGIN
a := 1;
b := a;
END;
/

ストアド・パッケージ等のPL/SQLプログラムのソースコードは、user_source というテーブルに格納されています。

SELECT text
FROM user_source
WHERE name = UPPER('test_proc')
AND type = 'PROCEDURE'
ORDER BY name, line
/

こちらはビューと違い、ソースコードの1行毎保存されています。
100行のソースコードであれば、100行の結果が返ってきます。

上記では、typeとしてプロシージャ(PROCEDURE)を指定しましたが、
パッケージの場合は、仕様部(spec)と本体部(body)で、それぞれ「PACKAGE」「PACKAGE BODY」と指定します。

sql*plus で出力した結果を、そのままテキストに保存したい場合は、

set pagesize 100
set linesize 1000
set trim on

などして、ヘッダや行の表示、行末文字を制御する必要があります。

ちなみにビューの場合もそうですが、オブジェクト名は大文字で保存されていますので注意しましょう。

Oracle,PL/SQL,SQL

Posted by tfurukaw