
# 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提供了一个接口DESCRIBE_PROCEDURE，将函数或存储过程的参数信息（如参数名，参数数据类型等）以列表的方式返回。
表1DBE_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
);
```
表2DBE_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；数值类型请参阅[数值类型](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0324.html#ZH-CN_TOPIC_0000002527986012)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| spare                      | number_table   | 是      | 预留参数，默认置0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| include_string_constraints | boolean        | 是      | 预留参数，不作任何处理。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 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用于查找其所属实体，但此时需要修改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);
```
