NAME_RESOLVE 过程 - 获取数据库对象的模式和其他成员资格信息
NAME_RESOLVE 过程能够获取数据库对象的模式和其他成员资格信息。同义词将解析为其基本对象。
语法
参数
- name
- 类型为 VARCHAR(1024) 的输入自变量,用于指定要解析的数据库对象的名称。可按以下格式指定:
[[ a.]b.]c[@dblink ] - context
- 类型为 INTEGER 的输入自变量。设置为下列值:
- 1 - 解析函数、过程或模块名称;
- 2 - 解析表、视图、序列或同义词名称;或者
- 3 - 解析触发器名称。
- schema
- 类型为 VARCHAR(128) 的输出自变量,用于指定包含 name 所指定对象的模式的名称。
- part1
- 类型为 VARCHAR(128) 的输出自变量,用于指定所解析表、视图、序列、触发器或模块的名称。
- part2
- 类型为 VARCHAR(128) 的输出自变量,用于指定所解析函数或过程(包括某个模块中的函数和过程)的名称。
- dblink
- 类型为 VARCHAR(128) 的输出自变量,用于指定数据库链接的名称(如果在 name 中指定了
@dblink)。 - part1_type
- 类型为 INTEGER 的输出自变量。返回下列值:
- 2 - 所解析对象为表;
- 4 - 所解析对象为视图;
- 6 - 所解析对象为序列;
- 7 - 所解析对象为存储过程;
- 8 - 所解析对象为存储函数;
- 9 - 所解析对象为模块或模块中的函数或过程;或者
- 12 - 所解析对象为触发器。
- object_number
- 类型为 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