Oracleデータベース上のすべてのストアドプロシージャを一覧表示するには、どのSQLを使用する必要がありますか?
可能であれば、2つのクエリが必要です。
DBA_OBJECTS
ビューには、プロシージャ(および他のほとんどすべてのオブジェクト)が一覧表示されます。
SELECT owner, object_name
FROM dba_objects
WHERE object_type = 'PROCEDURE'
DBA_SOURCE
ビューには、問題のプロシージャのソースコードの行が一覧表示されます。
SELECT line, text
FROM dba_source
WHERE owner = ?
AND name = ?
AND type = 'PROCEDURE'
ORDER BY line
注:権限によっては、DBA_OBJECTS
およびDBA_SOURCE
ビューをクエリできない場合があります。この場合、代わりにALL_OBJECTS
とALL_SOURCE
を使用できます。 DBA_
ビューには、データベース内のallオブジェクトが含まれますが、ALL_
ビューには、アクセスできるオブジェクトのみが含まれます。
DBA_OBJECTSから列挙すると、多くの手順を見逃した可能性があると思います:(私はOracle 12cを使用しており、SYSとしてログインしています)
select count(*) from dba_objects where object_type = 'PROCEDURE';
202
Oracleデータベース全体が202個のプロシージャしか持てないことは本当に不可能に見えました。
そして、DBA_PROCEDURESからのクエリ:
select owner||'-'||object_name || '-'||procedure_name from
dba_procedures WHERE PROCEDURE_NAME IS NOT NULL;
26539 rows selected.
ここで、すべてのデータベースにデフォルトで付属するSYSスキーマに焦点を当てます(私のものに固有ではありません)。
SYSに属するANONYMOUSストアドプロシージャ( http://www.praetoriate.com/t_high_perform_calling_procedures.htm )のクエリ:
select owner||'-'||object_name || '-'||procedure_name from dba_procedures WHERE PROCEDURE_NAME IS NULL and owner = 'SYS';
994 rows selected.
また、SYSの非匿名ストアドプロシージャには15Kがあります。
select owner||'-'||object_name || '-'||procedure_name from dba_procedures WHERE PROCEDURE_NAME IS NOT NULL and owner = 'SYS';
15408 rows
ストアドプロシージャ(パラメータなど)をイントロスペクトするためのすべての呼び出しを取得する場合は、次のオープンソースパッケージからそれを引き出すことができます。
http://code.google.com/p/orapig
OraPIGはOracle Python Interface Generatorです。Oracleパッケージをイントロスペクトし、それらのラッパーをpython]生成します。