NAME_RESOLVE プロシージャー - データベース・オブジェクトについてのスキーマおよびその他のメンバーシップ情報の取得

NAME_RESOLVE プロシージャーは、データベース・オブジェクトのスキーマおよびその他のメンバーシップ情報を取得する機能を提供します。 同義語は、それらの基本オブジェクトに解決されます。

構文

構文図を読む構文図をスキップするDBMS_UTILITY.NAME_RESOLVE( name,context,schema ,part1,part2,dblink,part1_type ,object_number)

パラメーター

name
解決するデータベース・オブジェクトの名前を指定する、タイプ VARCHAR (1024) の入力引数。 次の形式で指定できます。
[[ a.]b.]c[@dblink ]
context
タイプ INTEGER の入力引数。 以下の値のいずれかに設定されます。
  • 1 - 関数、プロシージャー、またはモジュールの名前を解決
  • 2 - 表、ビュー、シーケンス、または同義語の名前を解決
  • 3 - トリガー名を解決
schema
name によって指定されたオブジェクトが入るスキーマの名前を指定する、タイプ VARCHAR(128) の出力引数。
part1
解決された表、ビュー、シーケンス、トリガー、またはモジュールの名前を指定する、タイプ VARCHAR(128) の出力引数。
part2
解決された関数またはプロシージャー (モジュール内の関数およびプロシージャーを含む) の名前を指定する、タイプ VARCHAR(128) の出力引数。
dblink
データベース・リンクの名前を指定する、タイプ VARCHAR(128) の出力引数 (@dblinkname の中で指定されている場合)。
part1_type
タイプ INTEGER の出力引数。 以下の値を返します。
  • 2 - 解決済みオブジェクトは表です
  • 4 - 解決済みオブジェクトはビューです
  • 6 - 解決済みオブジェクトはシーケンスです
  • 7 - 解決済みオブジェクトはストアード・プロシージャーです
  • 8 - 解決済みオブジェクトはストアード関数です
  • 9 - 解決済みオブジェクトは、モジュール、またはパッケージ内の関数またはモジュールです
  • 12 - 解決済みオブジェクトはトリガーです
object_number
解決済みデータベース・オブジェクトのオブジェクト ID を指定する、タイプ INTEGER の出力引数。

許可

DBMS_UTILITY モジュールに対する EXECUTE 特権。

例 1: 以下のストアード・プロシージャーは、さまざまなデータベース・オブジェクトに対する NAME_RESOLVE プロシージャーの戻り値を表示するために使用されます。
SET SERVEROUTPUT ON@

CREATE OR REPLACE PROCEDURE name_resolve(
  IN p_name VARCHAR(4096), 
  IN p_context DECFLOAT )
BEGIN
  DECLARE v_schema VARCHAR(30);
  DECLARE v_part1 VARCHAR(30);
  DECLARE v_part2 VARCHAR(30);
  DECLARE v_dblink VARCHAR(30);
  DECLARE v_part1_type DECFLOAT;
  DECLARE v_objectid DECFLOAT;

  CALL DBMS_UTILITY.NAME_RESOLVE(p_name, p_context, v_schema, v_part1, v_part2,
    v_dblink, v_part1_type, v_objectid);
  CALL DBMS_OUTPUT.PUT_LINE('name      : ' || p_name);
  CALL DBMS_OUTPUT.PUT_LINE('context   : ' || p_context);
  CALL DBMS_OUTPUT.PUT_LINE('schema    : ' || v_schema);
  IF v_part1 IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('part1     : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('part1     : ' || v_part1);
  END IF;
  IF v_part2 IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('part2     : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('part2     : ' || v_part2);
  END IF;
  IF v_dblink IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('dblink    : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('dblink    : ' || v_dblink);
  END IF;
  CALL DBMS_OUTPUT.PUT_LINE('part1 type: ' || v_part1_type);
  CALL DBMS_OUTPUT.PUT_LINE('object id : ' || v_objectid);
END@

DROP TABLE S1.T1@
CREATE TABLE S1.T1 (C1 INT)@

CREATE OR REPLACE PROCEDURE S2.PROC1
BEGIN
END@

CREATE OR REPLACE MODULE S3.M1@
ALTER MODULE S3.M1 PUBLISH FUNCTION F1() RETURNS BOOLEAN
BEGIN
  RETURN TRUE;
END@

CALL NAME_RESOLVE( 'S1.T1', 2 )@
CALL NAME_RESOLVE( 'S2.PROC1', 2 )@
CALL NAME_RESOLVE( 'S2.PROC1', 1 )@
CALL NAME_RESOLVE( 'PROC1', 1 )@
CALL NAME_RESOLVE( 'M1', 1 )@
CALL NAME_RESOLVE( 'S3.M1.F1', 1 )@
この例では、以下の出力が結果として戻ります。
SET SERVEROUTPUT ON
Db20000I  The SET SERVEROUTPUT command completed successfully.

CREATE OR REPLACE PROCEDURE name_resolve(
  IN p_name VARCHAR(4096), 
  IN p_context DECFLOAT )
BEGIN
  DECLARE v_schema VARCHAR(30);
  DECLARE v_part1 VARCHAR(30);
  DECLARE v_part2 VARCHAR(30);
  DECLARE v_dblink VARCHAR(30);
  DECLARE v_part1_type DECFLOAT;
  DECLARE v_objectid DECFLOAT;

  CALL DBMS_UTILITY.NAME_RESOLVE(p_name, p_context, v_schema, v_part1, v_part2,
    v_dblink, v_part1_type, v_objectid);
  CALL DBMS_OUTPUT.PUT_LINE('name      : ' || p_name);
  CALL DBMS_OUTPUT.PUT_LINE('context   : ' || p_context);
  CALL DBMS_OUTPUT.PUT_LINE('schema    : ' || v_schema);
  IF v_part1 IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('part1     : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('part1     : ' || v_part1);
  END IF;
  IF v_part2 IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('part2     : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('part2     : ' || v_part2);
  END IF;
  IF v_dblink IS NULL THEN
    CALL DBMS_OUTPUT.PUT_LINE('dblink    : NULL');
  ELSE
    CALL DBMS_OUTPUT.PUT_LINE('dblink    : ' || v_dblink);
  END IF;
  CALL DBMS_OUTPUT.PUT_LINE('part1 type: ' || v_part1_type);
  CALL DBMS_OUTPUT.PUT_LINE('object id : ' || v_objectid);
END
Db20000I  The SQL command completed successfully.

DROP TABLE S1.T1
Db20000I  The SQL command completed successfully.

CREATE TABLE S1.T1 (C1 INT)
Db20000I  The SQL command completed successfully.

CREATE OR REPLACE PROCEDURE S2.PROC1
BEGIN
END
Db20000I  The SQL command completed successfully.

CREATE OR REPLACE MODULE S3.M1
Db20000I  The SQL command completed successfully.

ALTER MODULE S3.M1 PUBLISH FUNCTION F1() RETURNS BOOLEAN
BEGIN
  RETURN TRUE;
END
Db20000I  The SQL command completed successfully.

CALL NAME_RESOLVE( 'S1.T1', 2 )

  Return Status = 0

name      : S1.T1
context   : 2
schema    : S1      
part1     : T1
part2     : NULL
dblink    : NULL
part1 type: 2
object id : 8

CALL NAME_RESOLVE( 'S2.PROC1', 2 )
SQL0204N  "S2.PROC1" is an undefined name.  SQLSTATE=42704

CALL NAME_RESOLVE( 'S2.PROC1', 1 )

  Return Status = 0

name      : S2.PROC1
context   : 1
schema    : S2      
part1     : PROC1
part2     : NULL
dblink    : NULL
part1 type: 7
object id : 66611

CALL NAME_RESOLVE( 'PROC1', 1 )

  Return Status = 0

name      : PROC1
context   : 1
schema    : S2      
part1     : NULL
part2     : PROC1
dblink    : NULL
part1 type: 7
object id : 66611

CALL NAME_RESOLVE( 'M1', 1 )

  Return Status = 0

name      : M1
context   : 1
schema    : S3      
part1     : NULL
part2     : M1
dblink    : NULL
part1 type: 9
object id : 16

CALL NAME_RESOLVE( 'S3.M1.F1', 1 )

  Return Status = 0

name      : S3.M1.F1
context   : 1
schema    : S3      
part1     : M1
part2     : F1
dblink    : NULL
part1 type: 9
object id : 16
例 2: データベース・リンクによってアクセスされた表を解決します。 NAME_RESOLVE は、リモート・データベースにあるデータベース・オブジェクトの妥当性を検査しない点に注意してください。 これは、name 引数で指定されたコンポーネントをエコー出力して戻すだけです。
BEGIN
    name_resolve('sample_schema.emp@sample_schema_link',2);
END;

name      : sample_schema.emp@sample_schema_link
context   : 2
schema    : SAMPLE_SCHEMA
part1     : EMP
part2     :
dblink    : SAMPLE_SCHEMA_LINK
part1 type: 0
object id : 0