14 PL/Scopeの使用
PL/Scopeによって、強力で効率的なPL/Scopeソース・コード・ツールの開発が可能になります。このツールは、ソース・コードの参照および理解に費やされる時間を最小限にすることによって、PL/SQL開発者の生産性を向上させます。
PL/Scopeはアプリケーション開発者向けのものであり、通常は開発データベース環境で使用されます。
ノート:
PL/Scopeでは、ソース・コードがラップされているPL/SQLユニットのデータを収集できません。PL/SQLソース・コードのラップの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
トピック:
14.1 PL/Scopeの概要
PL/Scopeはコンパイラ駆動方式のツールであり、PL/SQLとSQL識別子およびPL/SQLソース・コード内のSQL文の使用方法を収集します。
PL/Scopeはプログラム・ユニットのコンパイル時にPL/SQL識別子、SQL識別子およびSQL文のメタデータを収集し、静的データ・ディクショナリ・ビューで使用できるようにします。収集されたデータには識別子の型、使用方法(DECLARATION、DEFINITION、REFERENCE、CALL、ASSIGNMENT)およびソース・コードにおける各使用場所に関する情報が含まれています。
Oracle Database 12c リリース2 (12.2)以降では、PL/ScopeはPL/SQLユニット内の静的SQLと動的SQLの呼出し位置の発生をレポートするように拡張されています。ネイティブ動的SQL (EXECUTE IMMEDIATE、OPEN CURSOR FOR)とDBMS_SQLコールの呼出し位置が収集されます。動的SQL文は実行時に生成されるため、コンパイル時には呼出し位置のみを収集できます。新しいDBA_STATEMENTSビューで収集されたデータは他のデータ・ディクショナリ・ビューとともに問合せを行い、プロジェクトのプログラミングに必要な変更の対象範囲やコード分析の実行についての疑問に答えを出すために役立ちます。また、正しく実行されないSQL文のソースを特定するためにも有用です。PL/Scopeは、表、ビューおよびPL/SQLユニット間の依存関係についての洞察を提供します。このレベルの詳細は、必要な変更の程度を判断する移行アセスメント・ツールとして使用できます。
-
表yの列xはPL/SQLコードのどこで、どのように使用されるのか。
-
自分のアプリケーションのPL/SQLコードのSQLに、TimesTenとの互換性があるかどうか。
-
宣言されてはいるが使用されていない定数、変数および例外が、自分のアプリケーションの場合どれなのか。
-
自分のコードにSQLインジェクションの危険性があるかどうか。
-
アプリケーションでコード化されたオプティマイザ・ヒントを使用するSQL文は何なのか。
-
BULK COLLECT句を持つSQLはどれなのか。SQLがどこから呼び出されるのか。
14.2 PL/Scopeの使用に必要な権限
PUBLICにはデフォルトで、様々なシステム表とビューに対するSELECT権限と、様々なPL/SQLオブジェクトに対するEXECUTE権限があります。
PL/Scopeデータは、DBA_IDENTIFIERSおよびDBA_STATEMENTSデータ・ディクショナリ・ビューで使用できます。ユーザーは、これらのビューでデータを問い合せる権限を持っている必要があります。
これらの関連ビューでは、次に示す権限が付与されています。
ビュー名 | ロールに付与された権限 |
---|---|
USER_IDENTIFIERS | PUBLICへのREAD |
ALL_IDENTIFIERS | PUBLICへのREAD |
DBA_IDENTIFIERS | SELECT_CATALOG_ROLEへのSELECT |
USER_STATEMENTS | PUBLICへのREAD |
ALL_STATEMENTS | PUBLICへのREAD |
DBA_STATEMENTS | SELECT_CATALOG_ROLEへのSELECT |
データベース管理者は次のような問合せを使用して、これらのビューに対する権限のリストを検証できます。
SELECT *
FROM SYS.DBA_TAB_PRIVS
WHERE GRANTEE = 'PUBLIC'
AND TABLE_NAME IN ('ALL_IDENTIFIERS','USER_IDENTIFIERS','ALL_STATEMENTS','USER_STATEMENTS');
14.3 識別子と文の収集の指定
デフォルトでは、PL/ScopeはPL/SQLソース・プログラムの識別子と文のデータを収集しません。収集対象を有効化し制御するには、PL/SQLコンパイル・パラメータPLSCOPE_SETTINGSを設定します。
Oracle Database 12c リリース2 (12.2)以降では、PLSCOPE_SETTINGS
に新しい構文があります。この構文は、識別子とSQL文のメタデータを収集するためのコントロールとオプションを、さらに提供します。メタデータは、静的データ・ディクショナリ・ビューDBA_IDENTIFIERS
とDBA_STATEMENTS
に収集されます。
パッケージ本体にある識別子など、PL/SQLソース・プログラムのすべての識別子用のデータをPL/Scopeによって収集するには、PL/SQLコンパイル・パラメータPLSCOPE_SETTINGS
を'IDENTIFIERS
:ALL'
に設定します。 IDENTIFIERS
句に使用できる値は、ALL, NONE
(デフォルト)、PUBLIC, SQL
およびPLSQL
です。新しいSQL識別子は、ALIAS、COLUMN、MATERIALIZED VIEW、OPERATOR、TABLEおよびVIEW
です。拡張されたメタデータ収集により、アプリケーションを理解する上で役立つレポートを生成できます。PL/Scopeは、PL/SQLアプリケーションのコード化プロジェクトの複雑さを、これまでよりも細かく評価できるツールとして使用できるようになりました。
PL/SQLソース・プログラムで使用される、すべてのSQL文のPL/Scopeデータを収集するには、PL/SQLコンパイル・パラメータPLSCOPE_SETTINGS
を'STATEMENTS
:ALL'
に設定します。デフォルト値はNONE
です。
ノート:
すべての識別子と文を収集すると、大量のデータが生成され、コンパイル時間が長くなる可能性があります。
PL/Scopeでは、収集するデータをSYSAUX
表領域に格納します。プログラム・ユニットのコンパイル中に、PL/Scope収集が有効でSYSAUX
表領域が使用不可の場合、PL/Scopeはコンパイルされたオブジェクトのデータを収集しません。コンパイラから警告は発行されませんが、USER_ERRORS
内に警告が保存されます。
関連項目:
-
PLSCOPE_SETTINGS
の詳細は、『Oracle Databaseリファレンス』を参照してください。 -
PL/SQLのコンパイル・パラメータの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
14.4 PL/Scopeデータによる領域の使用量
PL/ScopeのデータはSYSAUX
表領域に格納されます。SYSDBA
としてログオンしている場合は、例14-1の問合せを使用してPL/Scopeデータが使用している領域の容量を表示できます。
例14-1 PL/Scopeデータによる領域の使用量
問合せ:
SELECT SPACE_USAGE_KBYTES FROM V$SYSAUX_OCCUPANTS WHERE OCCUPANT_NAME='PL/SCOPE';
結果:
SPACE_USAGE_KBYTES ------------------ 1920 1 row selected.
関連項目:
SYSAUX
表領域の管理の詳細は、『Oracle Database管理者ガイド』を参照してください。
14.5 PL/Scopeデータの表示
PL/Scopeで収集したデータを表示するには、次のいずれかを使用できます。
14.5.1 PL/SQLおよびSQL識別子の静的データ・ディクショナリ・ビュー
静的データ・ディクショナリ・ビューのファミリDBA_IDENTIFIERS
では、その型や使用方法などのPL/Scope識別子に関する情報が表示されます。
トピック:
14.5.1.1 PL/Scopeが収集するPL/SQLおよびSQL識別子の型
表14-1に、PL/Scopeが収集する識別子の型をアルファベット順に示します。表14-1の識別子の型は、DBA_IDENTIFIERS
静的データ・ディクショナリ・ビューのファミリのTYPE
列に表示されます。
ノート:
PLSCOPE_SETTINGS='IDENTIFIERS:ALL'
でコンパイルされていないコンパイル・ユニットに宣言された識別子は、DBA_IDENTIFIERS
静的データ・ディクショナリ・ビューに表示されません。
ROWNUMなどの疑似列は、ユーザー定義の識別子ではないため、サポートされていません。
PL/Scopeはリテラル文字列の列名を無視します。
表14-1 PL/Scopeが収集する識別子の型
TYPE列の値 | コメント |
---|---|
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
|
|
各 |
|
|
|
|
|
|
|
|
|
イテレータは |
|
ラベル宣言もコンテキストとして機能します。 |
|
|
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
|
|
内部不透明型には |
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
|
|
|
|
|
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
PL/Scopeでは、シノニムのベース・オブジェクト名は解決しません。シノニムのベース・オブジェクト名を調べるには、 |
|
Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
|
|
|
|
|
オブジェクト属性、ローカル変数、パッケージ変数、レコード・フィールドのいずれにもできます。 |
|
|
|
この型は、ビューの編集に使用されます。 Oracle Database 12c リリース2 (12.2)で導入された、新しいSQL識別子です。 |
関連項目:
ストアド・オブジェクト内の識別子の詳細は、『Oracle Databaseリファレンス』を参照してください。
14.5.1.2 識別子の使用方法について
PL/Scopeは、識別子のかわりに実行されるアクションを説明する動詞として使用します。
表14-2に、PL/Scopeがレポートする使用方法をアルファベット順に示します。表14-2の識別子のアクションは、DBA_IDENTIFIERS
静的データ・ディクショナリ・ビューのファミリのUSAGE
列に表示されます。このビューについては、『Oracle Databaseリファレンス』で説明されています。
表14-2 PL/Scopeがレポートする使用方法
USAGE列の値 | 説明: |
---|---|
|
代入は、 代入には次のものがあります。
式およびネストした副問合せは、割当てソースとしてサポートされていません。 |
|
PL/Scopeのコンテキストでは、
|
|
ループ索引宣言の場合、( ラベル索引宣言の場合、 |
|
次の各識別子の型にそれぞれ
最上位の識別子の場合のみ、 |
|
参照には次のものがあります。
|
14.5.1.3 識別子の使用方法: 一意キー
すべての識別子の使用方法には、コード・ユニット内で一意の数値IDが指定されます。 これは識別子のUSAGE_ID
です。
*_IDENTIFIERS
ビューの各行は、PL/SQLユニットの識別子の一意の使用方法を表します。これらの各ビューでは、次のものがコンパイル・ユニット内で同等の一意キーです。
-
LINE
、COL
、USAGE
-
USAGE_ID
ノート:
IN OUT
モードでサブプログラムに渡される識別子では、*_IDENTIFIERS
にREFERENCE
使用方法(IN
に対応)およびASSIGNMENT
使用方法(OUT
に対応)の2つの行があります。
この例は、PROCEDURE p1に対して生成されたUSAGE_IDを示しています。
CREATE OR REPLACE PROCEDURE p1 (a OUT VARCHAR2)
IS
b VARCHAR2(100) := 'hello FROM p1';
BEGIN
a := b;
END;
/
SELECT USAGE_ID, USAGE, NAME
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'P1'
ORDER BY USAGE_ID;
1 DECLARATION P1 2 DEFINITION P1 3 DECLARATION A 4 REFERENCE VARCHAR2 5 DECLARATION B 6 REFERENCE VARCHAR2 7 ASSIGNMENT B 8 ASSIGNMENT A 9 REFERENCE B
関連項目:
*_IDENTIFIERS
ビューの使用方法は、「識別子の使用方法について」を参照してください。
14.5.1.4 識別子の使用方法について: コンテキスト
識別子の使用方法は、他の識別子の使用方法のコンテキストにすることができます。 これは、使用方法間の1対多の親子関係を作成します。親コンテキストの使用方法でのUSAGE_ID
は、子の使用方法ではUSAGE_CONTEXT_ID
になります。
コンテキストは、複数の使用方法の間の関係を検出する場合に役立ちます。最上位のスキーマ・オブジェクト宣言および定義を除き、識別子のすべての使用方法は別の使用方法のコンテキストで発生します。
デフォルトのトップレベルのコンテキスト(すべてのトップレベルのオブジェクトが含まれる)は、0のUSAGE_CONTEXT_ID
によって識別されます。
たとえば:
-
ローカル変数宣言は、最上位のプロシージャ宣言のコンテキスト内で発生します。
-
x VARCHAR2(10)
など、識別子が変数として宣言される場合、VARCHAR2
型参照のUSAGE_CONTEXT_ID
には、x
宣言のUSAGE_ID
が挿入され、変数宣言をその型に関連付けることができます。
つまり、例14-2に示すように、USAGE_CONTEXT_ID
はUSAGE_ID
に対する再帰外部キーです。
例14-2 USAGE_CONTEXT_IDおよびUSAGE_ID
ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:ALL';
CREATE OR REPLACE PROCEDURE a (p1 IN BOOLEAN) AUTHID DEFINER IS
v PLS_INTEGER;
BEGIN
v := 42;
DBMS_OUTPUT.PUT_LINE(v);
RAISE_APPLICATION_ERROR (-20000, 'Bad');
EXCEPTION
WHEN Program_Error THEN NULL;
END a;
/
CREATE or REPLACE PROCEDURE b (
p2 OUT PLS_INTEGER,
p3 IN OUT VARCHAR2
) AUTHID DEFINER
IS
n NUMBER;
q BOOLEAN := TRUE;
BEGIN
FOR j IN 1..5 LOOP
a(q); a(TRUE); a(TRUE);
IF j > 2 THEN
GOTO z;
END IF;
END LOOP;
<<z>> DECLARE
d CONSTANT CHAR(1) := 'X';
BEGIN
SELECT COUNT(*) INTO n FROM Dual WHERE Dummy = d;
END z;
END b;
/
WITH v AS (
SELECT Line,
Col,
INITCAP(NAME) Name,
LOWER(TYPE) Type,
LOWER(USAGE) Usage,
USAGE_ID,
USAGE_CONTEXT_ID
FROM USER_IDENTIFIERS
WHERE Object_Name = 'B'
AND Object_Type = 'PROCEDURE'
)
SELECT RPAD(LPAD(' ', 2*(Level-1)) ||
Name, 20, '.')||' '||
RPAD(Type, 20)||
RPAD(Usage, 20)
IDENTIFIER_USAGE_CONTEXTS
FROM v
START WITH USAGE_CONTEXT_ID = 0
CONNECT BY PRIOR USAGE_ID = USAGE_CONTEXT_ID
ORDER SIBLINGS BY Line, Col
/
結果:
IDENTIFIER_USAGE_CONTEXTS ------------------------------------------------------------- B................... procedure declaration B................. procedure definition P2.............. formal out declaration Pls_Integer... subtype reference P3.............. formal in out declaration Varchar2...... character datatype reference N............... variable declaration Number........ number datatype reference Q............... variable declaration Q............. variable assignment Boolean....... boolean datatype reference J............... iterator declaration A............. procedure call Q........... variable reference A............. procedure call A............. procedure call J............. iterator reference Z............. label reference Z............... label declaration D............. constant declaration D........... constant assignment Char........ subtype reference
14.5.1.5 識別子のシグネチャについて
識別子のシグネチャは、プログラム・ユニット内および複数のプログラム・ユニット間で一意のものです。つまり、シグネチャは複数の識別子が同じ名前であっても、同じプログラム・ユニット内に定義されているか、または異なるプログラム・ユニットに定義されているかを区別します。
例14-3のプログラム・ユニットの場合、p5
という名前の2つの識別子があり、静的データ・ディクショナリ・ビューUSER_IDENTIFIERS
にNAME
がp5
という行が複数ありますが、これらの行のSIGNATURE
は異なるものです。外部プロシージャp5
に関連付けられた行に1つのシグネチャがあり、内部プロシージャp5
に関連付けられた行には別のシグネチャがあります。プログラム・ユニットq
がプロシージャp5
をコールする場合、q
のUSER_IDENTIFIERS
ビューには、NAME
がp5
でSIGNATURE
が外部プロシージャp5
のシグネチャの行があります。
例14-3 p5という名前の2つの識別子を持つプログラム・ユニット
この例はp5という名前の2つの識別子を持つプログラム・ユニットを示して、シグネチャの一意性を明示しています。
CREATE OR REPLACE PROCEDURE p5 AUTHID DEFINER IS
PROCEDURE p5 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inner p5');
END p5;
BEGIN
DBMS_OUTPUT.PUT_LINE('Outer p5');
p5();
END p5;
/
SELECT LINE || ' > ' || TEXT
FROM ALL_SOURCE
WHERE NAME = 'P5'
AND TYPE = 'PROCEDURE'
ORDER BY LINE;
1 > PROCEDURE p5 AUTHID DEFINER IS 2 > PROCEDURE p5 IS 3 > BEGIN 4 > DBMS_OUTPUT.PUT_LINE('Inner p5'); 5 > END p5; 6 > BEGIN 7 > DBMS_OUTPUT.PUT_LINE('Outer p5'); 8 > p5(); 9 > END p5;
次の問合せは、PL/SQLユニットのSIGNATUREが、内部と外部のp5のDECLARATIONとDEFINITIONで同じであることを示しています。
SELECT SIGNATURE, USAGE, LINE, COL, USAGE_ID, USAGE_CONTEXT_ID
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'P5'
ORDER BY LINE, COL, USAGE_ID;
75CD5986BA2EE5C61ACEED8C7162528F DECLARATION 1 11 1 0 75CD5986BA2EE5C61ACEED8C7162528F DEFINITION 1 11 2 1 33FB9F948F526C4B0634C0F35DFA91F6 DECLARATION 2 13 3 2 33FB9F948F526C4B0634C0F35DFA91F6 DEFINITION 2 13 4 3 33FB9F948F526C4B0634C0F35DFA91F6 CALL 8 3 7 2
CREATE OR REPLACE PROCEDURE q AUTHID DEFINER IS
BEGIN
p5();
END q;
/
EXEC q; Outer p5 Inner p5
SELECT SIGNATURE, USAGE, LINE, COL, USAGE_ID, USAGE_CONTEXT_ID
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'Q'
AND NAME = 'P5'
ORDER BY LINE, COL, USAGE_ID;
75CD5986BA2EE5C61ACEED8C7162528F CALL 3 3 3 2
例14-4 VARCHAR2のすべての使用方法の検索
識別子のシグネチャは、グローバルに一意です。これは、データベースのすべてのユニット内で識別子のすべての使用方法を検索するために役立ちます。 この例は、VARCHAR2のすべての使用方法を検索する問合せを示しています。
SELECT UNIQUE OBJECT_NAME uses_varchar2
FROM ALL_IDENTIFIERS
WHERE SIGNATURE = (SELECT SIGNATURE
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'STANDARD'
AND OWNER = 'SYS'
AND USAGE = 'DECLARATION'
AND NAME = 'VARCHAR2')
ORDER BY OBJECT_NAME;
14.5.2 SQL文の静的データ・ディクショナリ・ビュー
DBA_STATEMENTS静的ディクショナリ・ビュー・ファミリは、PL/Scopeによって収集されたSQL文を説明します。
Oracle Database 12c リリース2 (12.2.0.1)以降では、新しいビューDBA_STATEMENTSが、PL/SQLユニット内の静的SQLの発生をレポートします。これは、SQL_ID、正規文のテキスト、文タイプ、有用な文使用の属性、シグネチャおよびPL/SQLコード内の場所についての情報を提供します。各行は、PL/SQLコード内のSQL文のインスタンスを表します。
トピック:
関連項目:
DBA_STATEMENTSビューの詳細は、『Oracle Databaseリファレンス』を参照してください。14.5.2.1 PL/Scopeが収集するSQL文の型
PL/Scope文タイプは、PL/SQLで使用されるSQL文を表します。
PL/SQLでの実行や、それ以外のSQL操作に使用できる文に対応するSQL文の型。文タイプは、DBA_STATEMENTS静的データ・ディクショナリ・ビュー・ファミリのTYPE列に表示されます。
このメタデータを収集するには、PL/SQLユニットをPLSCOPE_SETTINGS='STATEMENTS:ALL'でコンパイルする必要があります。
-
SELECT
-
UPDATE
-
INSERT
-
DELETE
-
MERGE
-
EXECUTE IMMEDIATE
-
SET TRANSACTION
-
LOCK TABLE
-
COMMIT
-
SAVEPOINT
-
ROLLBACK
-
OPEN
-
CLOSE
-
FETCH
14.5.2.2 文の場所: 一意キー
DBA_STATEMENTSビューの各行は、PL/SQLユニット内のSQL文の、一意の場所を表します。これは、コンパイル・ユニット内の一意のキーに相当します。
次に示す列は、PL/SQLコード内の文の位置を判別するために使用されます。
-
OWNER、OBJECT_NAME、OBJECT_TYPE、LINE、COL
-
USAGE_ID
USAGE_ID
は、PL/SQLユニット内で一意に定義されます。識別子とは異なり、SQL文には別の使用方法(DECLARATION
、ASSIGNMENT
またはREFERENCE
など)がありません。すべての文は、SQLエンジンに対する暗黙のCALL
とみなされます。そのため、DBA_STATEMENTS
ビューにUSAGE
列はありませんが、USAGE_ID
を使用します。
例14-5 USAGE_ID列を使用したSQL識別子と文の問合せ
PROCEDURE p1 (p_cust_id NUMBER,
p_cust_name OUT VARCHAR2)
IS
BEGIN
SELECT (SELECT CUST_FIRST_NAME
FROM CUSTOMERS)
INTO p_cust_name
FROM CUSTOMERS
WHERE CUSTOMER_ID = p_cust_id;
END;
SELECT USAGE_ID, TYPE, NAME, USAGE, LINE, COL
FROM ( SELECT USAGE_ID, TYPE, NAME, USAGE, LINE, COL
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'P1'
UNION
SELECT USAGE_ID, TYPE, 'SQL STATEMENT', " ", LINE, COL
FROM ALL_STATEMENTS
WHERE OBJECT_NAME = 'P1')
ORDER BY USAGE_ID;
USAGE_ID TYPE NAME USAGE LINE COL ---------- ------------------ --------------- ----------- ----- ----- 1 PROCEDURE P1 DECLARATION 1 11 2 PROCEDURE P1 DEFINITION 1 11 3 FORMAL IN P_CUST_ID DECLARATION 1 15 4 NUMBER DATATYPE NUMBER REFERENCE 1 25 5 FORMAL OUT P_CUST_NAME DECLARATION 1 33 6 CHARACTER DATATYPE VARCHAR2 REFERENCE 1 49 7 SQL STATEMENT SELECT 3 3 8 TABLE CUSTOMERS REFERENCE 4 10 9 FORMAL IN P_CUST_ID REFERENCE 4 38 10 COLUMN CUSTOMER_ID REFERENCE 4 26 11 FORMAL OUT P_CUST_NAME ASSIGNMENT 3 31 12 COLUMN CUST_FIRST_NAME REFERENCE 3 10
14.5.2.3 SQL文に使用方法について: コンテキスト
文は、他の文や識別子のコンテキストとして機能することができます。文は、他の文や識別子のコンテキスト内に置くこともできます。
USAGE_CONTEXT_ID
列は、文のコンテキストを判別するために使用されます。文の中に現れるすべての識別子は、その文のコンテキストの中に存在することになります。
式およびネストした副問合せは、割当てソースとしてサポートされていません。
例14-6 DBA_STATEMENTS USAGE_CONTEXT_IDを使用した識別子の問合せ
この例では、USAGE_CONTEXT_ID
列を使用して SELECT
文のコンテキスト内にある識別子を取得する方法を示しています。
PROCEDURE p1 (p_cust_id NUMBER,
p_cust_name OUT VARCHAR2)
IS
BEGIN
SELECT (SELECT CUST_FIRST_NAME
FROM CUSTOMERS)
INTO p_cust_name
FROM CUSTOMERS
WHERE CUSTOMER_ID = p_cust_id;
END;
SELECT USAGE_ID, LPAD(' ', 2*(level-1)) || TO_CHAR(USAGE) || ' ' || NAME usages, LINE, COL
FROM ( SELECT OBJECT_NAME, USAGE, USAGE_ID, USAGE_CONTEXT_ID, NAME, LINE, COL
FROM ALL_IDENTIFIERS
WHERE OBJECT_NAME = 'P1'
UNION
SELECT OBJECT_NAME, TYPE usage, USAGE_ID, USAGE_CONTEXT_ID, 'Statement' name, LINE, COL
FROM ALL_STATEMENTS
WHERE OBJECT_NAME = 'P1'
)
START WITH USAGE_CONTEXT_ID = 0 AND OBJECT_NAME = 'P1'
CONNECT BY PRIOR USAGE_ID = USAGE_CONTEXT_ID AND OBJECT_NAME = 'P1';
USAGE_ID USAGES LINE COL ---------- ----------------------------------- ---------- ---------- 1 DECLARATION P1 1 11 2 DEFINITION P1 1 11 3 DECLARATION P_CUST_ID 1 15 4 REFERENCE NUMBER 1 27 5 DECLARATION P_CUST_NAME 2 33 6 REFERENCE VARCHAR2 2 49 7 SELECT STATEMENT 5 5 8 REFERENCE CUSTOMERS 8 12 9 REFERENCE P_CUST_ID 9 26 10 REFERENCE CUSTOMER_ID 9 12 11 REFERENCE CUSTOMERS 6 20 12 REFERENCE CUST_FIRST_NAME 5 20 13 ASSIGNMENT P_CUST_NAME 7 12
14.5.2.4 SQL文のシグネチャについて
すべてのSQL文には、すべてのPL/SQLユニット内の文のインスタンスを識別する一意のPL/Scopeシグネチャがあります。
SQL文のシグネチャは、同じSQL_IDを使用するSQLのPL/SQLユニットからのコールと、他のPL/SQLユニットからの別のコールを区別します。
ネストされた副問合せは、ALL_STATEMENTS内の個別のSQL文ではありません。
例14-7 異なるPL/SQLユニットからコールされた場合の同じSQL文の個別のSQLシグネチャ
この例では、PROCEDURE p1およびp2からコールされたときの、同じSQL文の2つの異なるシグネチャを示しています。ネストされた副問合せに別のSQL_IDが割り当てられていないため、ALL_STATEMENTS内の個別のSQL文ではないことがわかります。
CREATE OR REPLACE PROCEDURE p1 (p_cust_id NUMBER,
p_cust_name OUT VARCHAR2)
IS
BEGIN
SELECT (SELECT CUST_FIRST_NAME
FROM CUSTOMERS)
INTO p_cust_name
FROM CUSTOMERS
WHERE CUSTOMER_ID = p_cust_id;
END;
/
CREATE OR REPLACE PROCEDURE P2 (p_cust_id NUMBER,
p_cust_name OUT VARCHAR2)
IS
BEGIN
SELECT (SELECT CUST_FIRST_NAME
FROM CUSTOMERS)
INTO p_cust_name
FROM CUSTOMERS
WHERE CUSTOMER_ID = p_cust_id;
END;
/
ACCEPT nam CHAR PROMPT "Enter OBJECT_NAME : "
SELECT *
FROM ALL_STATEMENTS
WHERE OBJECT_NAME = '&&nam'
ORDER BY LINE, COL;
ALL_STATEMENTS
を選択して、同じSQL_ID
の別のSQLシグネチャを確認します。new 3: WHERE OBJECT_NAME = 'P1' OE 138835D3A2EBBA76A7A064E4DC14B466 SELECT P1 PROCEDURE 7 5 5 2 c02b6yppqb46p NO NO NO NO NO NO YES SELECT (SELECT CUST_FIRST_NAME FROM CUSTOMERS) FROM CUSTOMERS WHERE CUSTOMER_ID = :B1 SELECT (SELECT CUST_FIRST_NAME FROM CUSTOMERS) FROM CUSTOMERS WHERE CUSTOMER_ID 0 new 3: WHERE OBJECT_NAME = 'P2' OE E6A5E27E5E90997A169C5C25393FAB35 SELECT P2 PROCEDURE 7 5 5 2 c02b6yppqb46p NO NO NO NO NO NO YES SELECT (SELECT CUST_FIRST_NAME FROM CUSTOMERS) FROM CUSTOMERS WHERE CUSTOMER_ID = :B1 SELECT (SELECT CUST_FIRST_NAME FROM CUSTOMERS) FROM CUSTOMERS WHERE CUSTOMER_ID 0
14.6 PL/SQLコードの管理に役立つデータ・ディクショナリ・ビューの概要
PL/Scopeデータ・ディクショナリ・ビューの他に、次に示す静的ディクショナリ・ビューがPL/SQLのプログラマにとって最も有用であり、PL/SQLコード管理レポートに関連する問合せで最も頻繁に参照されます。これは、すべての静的データ・ディクショナリ・ビューを網羅したリストではありません。
PL/SQLコードの管理に役立つデータ・ディクショナリ・ビューのサマリー
ビュー名 | 説明: |
---|---|
ALL_ARGUMENTS | 現在のユーザーがアクセスできる関数およびプロシージャの引数をリストします |
ALL_DEPENDENCIES | 現在のユーザーがアクセスできるプロシージャ、パッケージ、関数、パッケージ本体およびトリガー間の依存関係を説明します。 |
ALL_ERRORS | 現行のユーザーがアクセスできるストアド・オブジェクトでの現状のエラーを説明します |
ALL_IDENTIFIERS | 現行のユーザーがアクセスできるストアド・オブジェクトの識別子に関する情報を説明します |
USER_OBJECT_SIZE | 現行のユーザーが所有するPL/SQLオブジェクトのサイズ(バイト単位)を説明します。この情報はコンパイラとランタイム・エンジンで使用するものですが、この情報を使用すると、環境内の大きなプログラムを識別できます。 |
ALL_OBJECTS | 現行ユーザーがアクセス可能なすべてのオブジェクトが表示されます。 |
ALL_PLSQL_OBJECT_SETTINGS | 現行のユーザーがアクセスできるストアド・オブジェクトのコンパイラ設定の情報を説明します |
ALL_PROCEDURES | 現在のユーザーがアクセスできるすべてのPL/SQL関数とプロシージャ、および関連するプロパティを説明します |
ALL_SEQUENCES | 現行ユーザーがアクセス可能な順序を説明します |
ALL_SOURCE | 現行のユーザーがアクセスできるストアド・オブジェクトのテキスト・ソースを説明します |
ALL_STATEMENTS | ユーザーがアクセスできるストアドPL/SQLオブジェクト内のすべてのSQL文を説明します |
ALL_STORED_SETTINGS | 現行のユーザーが実行権限を持つストアドPL/SQLユニットの永続パラメータ設定を説明します |
ALL_SYNONYMS | 現行のユーザーがアクセスできるシノニムを説明します |
ALL_TAB_COLUMNS | 現行のユーザーがアクセスできる表、ビューおよびクラスタの列を説明します |
ALL_TABLES | 現行のユーザーがアクセスできるリレーショナル表を説明します |
ALL_TRIGGERS | 現行のユーザーがアクセスできる表のトリガーを説明します |
ALL_VIEWS | 現行のユーザーがアクセスできるビューを説明します |