更新时间:2024-06-03 GMT+08:00

DBE_DESCRIBE

数据类型介绍

高级包DBE_DESCRIBE内置了两个数据类型,用于DESCRIBE_PROCEDURE接口的返回值。

  • DBE_DESCRIBE.NUMBER_TABLE
  • DBE_DESCRIBE.VARCHAR2_TABLE

接口介绍

高级包DBE_DESCRIBE提供了一个接口DESCRIBE_PROCEDURE,将函数或存储过程的参数信息(如参数名,参数数据类型等)以列表的方式返回。

表1 DBE_DESCRIBE接口总览

接口名称

描述

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.]]function[@dblink],其中:

  • 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

指定参数的模式。 其中参数模式有:

  • 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参数与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;
/