DBE_DESCRIBE
数据类型介绍
高级包DBE_DESCRIBE内置了两个数据类型,用于DESCRIBE_PROCEDURE接口的返回值。
- DBE_DESCRIBE.NUMBER_TABLE
- DBE_DESCRIBE.VARCHAR2_TABLE
接口介绍
高级包DBE_DESCRIBE提供了一个接口DESCRIBE_PROCEDURE,将函数或存储过程的参数信息(如参数名,参数数据类型等)以列表的方式返回。
接口名称 |
描述 |
---|---|
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 );
参数 |
类型 |
是否允许为空 |
描述 |
---|---|---|---|
object_name |
varchar2 |
否 |
存储过程的名称。此参数的语法格式为[[schema.]]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 |
是 |
指定参数的模式。 其中参数模式有:
|
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参数与ORA模式数据库的数据类型存在差异。GaussDB返回数据类型的OID,ORA模式数据库返回ORA模式数据库内部的数据类型的编号。
- 参数include_string_constraints对存储过程不起任何作用,本身的值不会发生变化,也不会影响其它参数的返回值。
- 使用create type操作创建的数据类型,由于这些数据类型的OID为不确定的,所以请勿将这些OID用于固定判断等。
- 对于dataposition参数,如果指定的是存储过程,则返回值从1开始;如果指定的是函数,则返回值从0开始,其中0代表函数返回值的位置序号。
- 对于argument_name参数,如果指定的是函数,那么返回值的第一个位置为空,该位置表示被描述函数的返回值的名称(即空的名称)。
- 对于没有执行权限的存储过程/函数/包,会当作不存在的实体并报错处理。
- 入参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; /