DBE_DESCRIBE
数据类型介绍
高级包DBE_DESCRIBE内置了两个数据类型,这两个数据类型使用自定义类型创建,用于DESCRIBE_PROCEDURE接口的返回值。
- DBE_DESCRIBE.NUMBER_TABLE
该类型是NUMBER的TABLE类型,通过TABLE OF语法实现。
DBE_DESCRIBE.NUMBER_TABLE原型为:
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原型为:
CREATE TYPE DBE_DESCRIBE.VARCHAR2_TABLE AS TABLE OF VARCHAR2(30) INDEX BY INTEGER;
接口介绍
高级包DBE_DESCRIBE提供了接口DBE_DESCRIBE.DESCRIBE_PROCEDURE,接口描述请参见表1。
- 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
是
预留参数,默认置FALSE。
- datatype参数与ORA模式数据库的数据类型存在差异。GaussDB返回数据类型的OID,ORA模式数据库返回ORA模式数据库内部的数据类型编号。
- 参数include_string_constraints作为预留参数,本身的值不会发生变化,也不会影响其它参数的返回值。
- 使用CREATE TYPE操作创建的数据类型,由于这些数据类型的OID是不确定的,所以请勿将这些OID用于固定判断等。
- 对于dataposition参数,如果指定的是存储过程,则返回值从1开始;如果指定的是函数,则返回值从0开始,其中0代表函数返回值的位置序号。
- 对于argument_name参数,如果指定的是函数,那么返回值的第一个位置为空,该位置表示被描述函数的返回值的名称(即空的名称)。
- 不可直接指定包Package,否则会报错。
- 对于没有执行权限的存储过程/函数/包,会当作不存在的实体并报错处理。
- 入参reserved1和reserved2不参与内部处理,输入任何字符串都不会对返回结果有影响。
- 该高级包不可指定通过DBLINK获取的存储过程/函数。
- 推荐在被指定的存储过程/函数前增加Schema前缀。若省略了Schema前缀,则该高级包会使用当前会话的Schema来查找其所属实体(若当前会话Schema中无该所属实体,则会遵循behavior_compat_options中配置项bind_procedure_searchpath的机制来操作)。
- 若使用%type操作从表字段中取得数据类型,则不会保留类型的约束(带约束的数据类型如NUMBER(3)、VARCHAR2(10)等)。
示例:
-- 创建存储过程封装该高级包,用于打印返回值。 gaussdb=# 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 PROCEDURE -- 创建含有三个重载的函数。 gaussdb=# 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 FUNCTION gaussdb=# 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 FUNCTION gaussdb=# 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; / CREATE FUNCTION -- 调用上述封装。 gaussdb=# BEGIN PRINT_DESCRIBE('TEST_FUNC_OVERLOAD'); END; / -- 执行结果。 overload 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 dataposition 0 1 2 3 0 1 2 3 4 5 0 1 2 3 4 5 6 datalevel 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 argument_name param_a param_b param_c param_a param_b param_c param_d param_e param_a param_b param_c param_d param_e param_f default_value 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 in_out 1 0 0 1 1 0 0 0 1 2 1 0 0 0 0 1 2 length 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 precision 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 scale 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 radix 0 10 0 0 0 10 0 0 0 0 0 10 0 0 0 0 10 ANONYMOUS BLOCK EXECUTE -- 清理。 gaussdb=# DROP FUNCTION TEST_FUNC_OVERLOAD ( param_a IN NUMBER, param_b IN VARCHAR2, param_c OUT TEXT ); DROP FUNCTION gaussdb=# 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 gaussdb=# 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 FUNCTION gaussdb=# DROP PROCEDURE PRINT_DESCRIBE (obj_name IN VARCHAR2); DROP PROCEDURE