【问题标题】:Oracle procedure 'out' 'table of varchar2' type parameterOracle 过程 'out' 'table of varchar2' 类型参数
【发布时间】:2011-06-24 15:31:53
【问题描述】:

我想获取一个在一个过程(b) 中分配的列表,并将其作为 OUT 参数返回给过程(a) 中的“varchar2 表”类型的变量。如何定义 OUT 参数类型?

例如)

procedure_a()
type t_list IS TABLE OF VARCHAR2(10)

l_list t_list;

procedure_b(l_list);

end procedure_a;

procedure_b(out_list OUT ????) 

OUT 类型是什么?

提前致谢。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    类型需要在 A 和 B 都可以引用的地方声明。一种选择是在包中声明类型,即

    SQL> create package some_pkg
      2  as
      3    type t_list is table of varchar2(10);
      4
      5    procedure procedureA;
      6    procedure procedureB( p_list OUT t_list );
      7  end;
      8
      9  /
    
    Package created.
    
    SQL> create or replace package body some_pkg
      2  as
      3    procedure procedureA
      4    as
      5      l_list t_list;
      6    begin
      7      procedureB( l_list );
      8      dbms_output.put_line( l_list.count );
      9    end;
     10
     11    procedure procedureB
     12      ( p_list OUT t_list )
     13    as
     14    begin
     15      select ename
     16        bulk collect into p_list
     17        from emp;
     18    end;
     19  end;
     20  /
    
    Package body created.
    
    SQL> exec some_pkg.procedureA;
    16
    
    PL/SQL procedure successfully completed.
    

    另一种选择是在 SQL 中声明类型,即

    SQL> create type t_list
      2      as table of varchar2(10);
      3  /
    
    Type created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  create or replace procedure procedureB( p_list OUT t_list )
      2  as
      3  begin
      4    select ename
      5      bulk collect into p_list
      6      from emp;
      7* end;
    SQL> /
    
    Procedure created.
    
    SQL> create or replace procedure procedureA
      2  as
      3    l_list t_list;
      4  begin
      5    procedureB( l_list );
      6    dbms_output.put_line( l_list.count );
      7  end;
      8  /
    
    Procedure created.
    
    SQL> exec procedureA;
    16
    
    PL/SQL procedure successfully completed.
    

    【讨论】:

    • 感谢您的建议。最后一个问题,假设我知道确切的列表(示例静态名称列表),使用 TABLE OF TYPE VARCHAR2 与 Vararray 有什么优势?
    • @help - 如果您知道集合将包含的元素数量并且该数量永远不会改变,那么使用嵌套表而不是 VARRAY 没有任何优势。但是,由于嵌套表的大小不是固定的,当静态列表在未来不可避免地发生变化时,嵌套表更加灵活。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2019-01-22
    • 2018-02-20
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多