#DBMS_DESCRIBE
DBMS_DESCRIBE包提供了一组内置的存储过程,用于获取用户自定义存储过程的参数描述信息,暂不适用于分布式部署。
# DESCRIBE_PROCEDURE
DBMS_DESCRIBE.DESCRIBE_PROCEDURE(
object_name IN VARCHAR,
reserved1 IN VARCHAR,
reserved2 IN VARCHAR,
overload OUT NUMBER_TABLE,
position OUT NUMBER_TABLE,
data_level OUT NUMBER_TABLE,
argument_name OUT VARCHAR2_TABLE,
datatype OUT NUMBER_TABLE,
default_value OUT NUMBER_TABLE,
in_out OUT NUMBER_TABLE,
length OUT NUMBER_TABLE,
precision OUT NUMBER_TABLE,
scale OUT NUMBER_TABLE,
radix OUT NUMBER_TABLE,
spare OUT NUMBER_TABLE,
include_string_constraints IN BOOLEAN DEFAULT FALSE);
DESCRIBE_PROCEDURE程序用于获取指定用户自定义存储过程的参数描述信息,输出参数的类型如下:
NUMBER_TABLE类型:表示datatype为NUMBER类型+index_datatype为INTEGER类型的关联数组(INDEX-BY TABLE)。
VARCHAR2_TABLE类型:表示datatype为VARCHAR类型+index_datatype为INTEGER类型的关联数组。
参数 | 描述 |
---|---|
object_name | 存储过程名,可以使用同义词。可设置为用户自定义存储过程(或函数)名或用户自定义包的子过程(或子函数)名。 |
reserved1 | 保留字段。 |
reserved2 | 保留字段。 |
overload | 保留字段,返回0。 |
position | 参数在参数列表中的位置。第n个参数的位置为n,返回值的位置为0。 |
data_level | 保留字段,返回0。 |
argument_name | 参数名。 |
datatype | 参数的数据类型ID。可以通过查询V$DATATYPE视图获取对应的数据类型名。 |
default_value | 参数是否具有默认值,是则返回1,否则返回0。 |
in_out | 参数方向,0表示IN方向,1表示OUT方向,2表示IN OUT方向。 |
length | 参数的数据类型长度(字符类型宽度)。 |
precision | NUMBER类型精度,非NUMBER类型返回0。 |
scale | NUMBER类型刻度,非NUMBER类型返回0。 |
radix | 基数,TINYINT/SMALLINT/INTEGER/BIGINT/NUMBER类型返回10,BIT类型返回2,其他类型返回0。 |
spare | 保留字段,返回0。 |
include_string_constraints | 对于CHAR/VARCHAR/NCHAR/NVARCHAR/RAW类型的过程体参数,置为true时length参数返回字符类型宽度,置为false时length参数返回0。 |
程序使用规则:
返回的关联数组下标从1开始递增,成员的顺序和参数位置的顺序一致。
若返回的关联数组中不存在键值对成员,则表示指定的用户自定义存储过程无参数。
若在获取用户自定义包中的子过程的参数信息时,返回的关联数组只包含1个键值对成员(argument_name为NULL,position为1,其余为0),则表示该子过程无参数。
示例(单机、共享集群)
CREATE OR replace PROCEDURE test_dbms_describe_proc(obj VARCHAR, getstrlen BOOLEAN DEFAULT false) IS
overload DBMS_DESCRIBE.NUMBER_TABLE;
position1 dbms_describe.number_table;
c_level dbms_describe.number_table;
arg_name dbms_describe.varchar2_table;
dty dbms_describe.number_table;
def_val dbms_describe.number_table;
p_mode dbms_describe.number_table;
length1 dbms_describe.number_table;
precision dbms_describe.number_table;
scale dbms_describe.number_table;
radix dbms_describe.number_table;
spare dbms_describe.number_table;
BEGIN
DBMS_DESCRIBE.DESCRIBE_PROCEDURE(
obj,null,null,overload,position1,c_level,
arg_name,dty,def_val,p_mode,length1,
precision,scale,radix,spare,getstrlen);
DBMS_OUTPUT.PUT_LINE('arg count: '||arg_name.count);
FOR i IN arg_name.first..arg_name.last LOOP
DBMS_OUTPUT.PUT_LINE('overload: '||overload(i));
DBMS_OUTPUT.PUT_LINE('position: '||position1(i));
DBMS_OUTPUT.PUT_LINE('level: '||c_level(i));
DBMS_OUTPUT.PUT_LINE('arg_name: '||arg_name(i));
DBMS_OUTPUT.PUT_LINE('datatype: '||dty(i));
DBMS_OUTPUT.PUT_LINE('default: '||def_val(i));
DBMS_OUTPUT.PUT_LINE('in_out: '||p_mode(i));
DBMS_OUTPUT.PUT_LINE('length: '||length1(i));
DBMS_OUTPUT.PUT_LINE('precision: '||precision(i));
DBMS_OUTPUT.PUT_LINE('scale: '||scale(i));
DBMS_OUTPUT.PUT_LINE('radix: '||radix(i));
DBMS_OUTPUT.PUT_LINE('spare: '||spare(i));
END LOOP;
END;
/
exec test_dbms_describe_proc('test_dbms_describe_proc');
--result
arg count: 2
overload: 0
position: 1
level: 0
arg_name: OBJ
datatype: 26
default: 0
in_out: 0
length: 0
precision: 0
scale: 0
radix: 0
spare: 0
overload: 0
position: 2
level: 0
arg_name: GETSTRLEN
datatype: 1
default: 1
in_out: 0
length: 1
precision: 0
scale: 0
radix: 0
spare: 0
# 异常
异常 | 描述 |
---|---|
PROCEDURE_NOT_EXIST | 过程不存在,无法描述。 |
PROCEDURE_INVALID | 过程失效,无法描述。 |
示例(单机、共享集群)
-- 过程不存在
BEGIN
test_dbms_describe_proc('procabc');
EXCEPTION
WHEN DBMS_DESCRIBE.PROCEDURE_NOT_EXIST THEN
DBMS_OUTPUT.PUT_LINE('cannot describe a non-existent procedure');
END;
/
--result
cannot describe a non-existent procedure
-- 过程失效
CREATE OR replace PROCEDURE procabc IS
BEGIN
a:=1;
END;
/
YAS-04253 PL/SQL compiling errors:
[3:1] YAS-04243 invalid identifier "A"
BEGIN
test_dbms_describe_proc('procabc');
EXCEPTION
WHEN DBMS_DESCRIBE.PROCEDURE_INVALID THEN
DBMS_OUTPUT.PUT_LINE('cannot describe an invalid procedure');
END;
/
--result
cannot describe an invalid procedure