# 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]。
 表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-ref-v10-gaussdb/gaussdb-08-0005.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | spare                        | number_table    | 是     | 预留参数，默认置0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
  | include_string_constraints | boolean          | 是      | 预留参数，默认置FALSE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
     
  ![](https://support.huaweicloud.com/distributed-ref-v10-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来查找其所属实体（若当前会话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                11112222223333333
  dataposition            01230123450123456
  datalevel               00000000000000000
  argument_name           param_aparam_bparam_cparam_aparam_bparam_cparam_dparam_eparam_aparam_bparam_cparam_dparam_eparam_f
  default_value           00000110000110000
  in_out                  10011000121000012
  length                  00000000000000000
  precision               00000000000000000
  scale                   00000000000000000
  radix                   010000100000010000010
  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
  ```
  
 
