DBE_DESCRIBE
数据类型介绍
高级包DBE_DESCRIBE内置了两个数据类型,这两个数据类型使用自定义类型创建,用于DESCRIBE_PROCEDURE接口的返回值。
- DBE_DESCRIBE.NUMBER_TABLE
该类型是NUMBER的TABLE类型,通过TABLE OF语法实现。
DBE_DESCRIBE.NUMBER_TABLE类型的原型为:
1
CREATE TYPE DBE_DESCRIBE.NUMBER_TABLE AS TABLE OF NUMBER INDEX BY INTEGER;
- DBE_DESCRIBE.VARCHAR2_TABLE
该类型是VARCHAR2的TABLE类型,通过TABLE OF语法实现。
DBE_DESCRIBE.VARCHAR2_TABLE类型的原型为:
1
CREATE TYPE DBE_DESCRIBE.VARCHAR2_TABLE AS TABLE OF VARCHAR2(30) INDEX BY INTEGER;
接口介绍
高级包DBE_DESCRIBE提供了一个接口DESCRIBE_PROCEDURE,将函数或存储过程的参数信息(如参数名,参数数据类型等)以列表的方式返回。
接口名称 |
描述 |
---|---|
用来显示存储过程或函数的参数信息。 |
- DBE_DESCRIBE.DESCRIBE_PROCEDURE
存储过程DESCRIBE_PROCEDURE用来显示存储过程或函数的参数信息,如参数名、参数模式、参数位置等,将函数或存储过程的参数信息以列表的方式返回。
DBE_DESCRIBE.DESCRIBE_PROCEDURE的函数原型:
DBE_DESCRIBE.DESCRIBE_PROCEDURE( object_name IN VARCHAR2, reserved1 IN VARCHAR2, reserved2 IN VARCHAR2, overload OUT DBE_DESCRIBE.NUMBER_TABLE, dataposition OUT DBE_DESCRIBE.NUMBER_TABLE, datalevel OUT DBE_DESCRIBE.NUMBER_TABLE, argument_name OUT DBE_DESCRIBE.VARCHAR2_TABLE, datatype OUT DBE_DESCRIBE.NUMBER_TABLE, default_value OUT DBE_DESCRIBE.NUMBER_TABLE, in_out OUT DBE_DESCRIBE.NUMBER_TABLE, datalength OUT DBE_DESCRIBE.NUMBER_TABLE, dataprecision OUT DBE_DESCRIBE.NUMBER_TABLE, scale OUT DBE_DESCRIBE.NUMBER_TABLE, radix OUT DBE_DESCRIBE.NUMBER_TABLE, spare OUT DBE_DESCRIBE.NUMBER_TABLE, include_string_constraints OUT BOOLEAN );
表2 DBE_DESCRIBE.DESCRIBE_PROCEDURE的接口说明 参数
类型
是否允许为空
描述
object_name
varchar2
否
存储过程的名称。此参数的语法格式为[[schema.]package.]function[@dblink],其中:
- schema:可选,模式名称。
- package:可选,包名称。
- function:不能为空,函数或存储过程名称。
- dblink:可选,远程连接名称。
reserved1
varchar2
是
预留参数。
reserved2
varchar2
是
预留参数。
overload
number_table
是
分配给存储过程/函数的唯一编号。 如果存储过程/函数存在重载,则overload为该存储过程/函数的每个重载,以整个存储过程/函数为粒度,对overload从1开始递增编号。如果存储过程/函数不存在重载,则overload置0。
dataposition
number_table
是
表示指定参数在参数列表中的位置。
datalevel
number_table
是
置0。
argument_name
varchar2_table
是
与指定的存储过程相关联的参数名称。
datatype
number_table
是
被指定参数的数据类型OID。
default_value
number_table
是
如果被指定的参数有一个默认值,则值为 1;否则,值为 0。
in_out
number_table
是
指定参数的模式。 其中参数模式有:
- 0:IN
- 1:OUT
- 2:IN OUT
datalength
number_table
是
暂不支持,默认置0。
dataprecision
number_table
是
暂不支持,默认置0。
scale
number_table
是
暂不支持,默认置0。
radix
number_table
是
若为数值类型(如NUMBER、INTEGER等),返回10,否则置0;数值类型请参阅数值类型。
spare
number_table
是
预留参数,默认置0。
include_string_constraints
boolean
是
预留参数,不作任何处理。
- datatype参数与A模式数据库的数据类型存在差异。GaussDB返回数据类型的OID,A模式数据库返回A模式数据库内部的数据类型的编号。
- 参数include_string_constraints对存储过程不起任何作用,本身的值不会发生变化,也不会影响其它参数的返回值。
- 使用create type操作创建的数据类型,由于这些数据类型的OID为不确定的,所以请勿将这些OID用于固定判断等。
- 对于dataposition参数,如果指定的是存储过程,则返回值从1开始;如果指定的是函数,则返回值从0开始,其中0代表函数返回值的位置序号。
- 对于argument_name参数,如果指定的是函数,那么返回值的第一个位置为空,该位置表示被描述函数的返回值的名称(即空的名称)。
- 不可直接指定包PACKAGE,否则会报错处理。
- 对于没有执行权限的存储过程/函数/包,会当作不存在的实体并报错处理。
- 入参reserved1和reserved2不参与内部处理,输入任何字符串都不会对返回结果有任何影响。
- 该高级包不可指定通过DBLINK获取的存储过程/函数。
- 推荐在被指定的存储过程/函数前增加schema前缀。若省略了schema前缀,则该高级包会使用当前会话的schema用于查找其所属实体,但此时需要修改behavior_compat_options参数值为bind_procedure_searchpath才可生效。
- 若使用%type操作从表字段中取得数据类型,则不会保留类型的约束(带约束的数据类型如NUMBER(3)、VARCHAR2(10)等)。
示例:
-- 创建存储过程封装该高级包,用于打印返回值。 CREATE PROCEDURE PRINT_DESCRIBE (obj_name IN VARCHAR2) AS a_overload DBE_DESCRIBE.NUMBER_TABLE; a_position DBE_DESCRIBE.NUMBER_TABLE; a_level DBE_DESCRIBE.NUMBER_TABLE; a_arg_name DBE_DESCRIBE.VARCHAR2_TABLE; a_dty DBE_DESCRIBE.NUMBER_TABLE; a_def_val DBE_DESCRIBE.NUMBER_TABLE; a_mode DBE_DESCRIBE.NUMBER_TABLE; a_length DBE_DESCRIBE.NUMBER_TABLE; a_precision DBE_DESCRIBE.NUMBER_TABLE; a_scale DBE_DESCRIBE.NUMBER_TABLE; a_radix DBE_DESCRIBE.NUMBER_TABLE; a_spare DBE_DESCRIBE.NUMBER_TABLE; a_include_string_constraints BOOLEAN; BEGIN DBE_DESCRIBE.DESCRIBE_PROCEDURE( obj_name, null, null, a_overload, a_position, a_level, a_arg_name, a_dty, a_def_val, a_mode, a_length, a_precision, a_scale, a_radix, a_spare, a_include_string_constraints ); dbe_output.print('overload ' || chr(9)); for indx in 1 .. a_overload.count loop dbe_output.print(a_overload(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('dataposition ' || chr(9)); for indx in 1 .. a_position.count loop dbe_output.print(a_position(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('datalevel ' || chr(9)); for indx in 1 .. a_level.count loop dbe_output.print(a_level(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('argument_name ' || chr(9)); for indx in 1 .. a_arg_name.count loop dbe_output.print(a_arg_name(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('default_value ' || chr(9)); for indx in 1 .. a_def_val.count loop dbe_output.print(a_def_val(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('in_out ' || chr(9)); for indx in 1 .. a_mode.count loop dbe_output.print(a_mode(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('length ' || chr(9)); for indx in 1 .. a_length.count loop dbe_output.print(a_length(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('precision ' || chr(9)); for indx in 1 .. a_precision.count loop dbe_output.print(a_precision(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('scale ' || chr(9)); for indx in 1 .. a_scale.count loop dbe_output.print(a_scale(indx) || chr(9)); end loop; dbe_output.print_line(' '); dbe_output.print('radix ' || chr(9)); for indx in 1 .. a_radix.count loop dbe_output.print(a_radix(indx) || chr(9)); end loop; dbe_output.print_line(' '); END; / --创建带三个重载的函数。 CREATE OR REPLACE FUNCTION TEST_FUNC_OVERLOAD ( param_a IN NUMBER, param_b IN VARCHAR2, param_c OUT TEXT ) RETURN VARCHAR2 package AS BEGIN dbe_output.print_line('This procedure/function test num param.'); RETURN 'This procedure/function test num param.'; END; / CREATE OR REPLACE FUNCTION TEST_FUNC_OVERLOAD ( param_a IN NUMBER DEFAULT 20, param_b VARCHAR2 DEFAULT 'n', param_c IN TEXT, param_d OUT DATE, param_e INOUT RAW ) RETURN VARCHAR2 package AS BEGIN dbe_output.print_line('This procedure/function test num param.'); RETURN 'This procedure/function test num param.'; END; / CREATE OR REPLACE FUNCTION TEST_FUNC_OVERLOAD ( param_a IN NUMBER DEFAULT 20, param_b VARCHAR2 DEFAULT 'n', param_c IN TEXT, param_d IN DATE, param_e OUT RAW, param_f INOUT INTEGER ) RETURN VARCHAR2 package AS BEGIN dbe_output.print_line('This procedure/function test num param.'); RETURN 'This procedure/function test num param.'; END; / --调用上述封装。 BEGIN PRINT_DESCRIBE('TEST_FUNC_OVERLOAD'); END; / --清理。 DROP FUNCTION TEST_FUNC_OVERLOAD ( param_a IN NUMBER, param_b IN VARCHAR2, param_c OUT TEXT ); DROP FUNCTION TEST_FUNC_OVERLOAD (param_a IN NUMBER, param_b VARCHAR2, param_c IN TEXT, param_d OUT DATE, param_e INOUT RAW ); DROP FUNCTION TEST_FUNC_OVERLOAD (param_a IN NUMBER, param_b VARCHAR2, param_c IN TEXT, param_d IN DATE, param_e OUT RAW, param_f INOUT INTEGER ); DROP PROCEDURE PRINT_DESCRIBE (obj_name IN VARCHAR2);