更新时间:2024-08-20 GMT+08:00

DBE_DESCRIBE

数据类型介绍

高级包DBE_DESCRIBE内置了两个数据类型,这两个数据类型使用自定义类型创建,用于DESCRIBE_PROCEDURE接口的返回值。

  • DBE_DESCRIBE.NUMBER_TABLE

    该类型是NUMBER的TABLE类型,通过TABLE OF语法实现。

    DBE_DESCRIBE.NUMBER_TABLE类型的原型为:

    1
    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类型的原型为:

    1
    CREATE TYPE DBE_DESCRIBE.VARCHAR2_TABLE AS TABLE OF VARCHAR2(30) INDEX BY INTEGER;
    

接口介绍

高级包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.]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

    预留参数,不作任何处理。

    • datatype参数与A模式数据库的数据类型存在差异。GaussDB返回数据类型的OID,A模式数据库返回A模式数据库内部的数据类型的编号。
    • 参数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);