Oracle 过程 'out' 'table of varchar2' 类型参数

Posted

技术标签:

【中文标题】Oracle 过程 \'out\' \'table of varchar2\' 类型参数【英文标题】: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 类型是什么?

提前致谢。

【问题讨论】:

【参考方案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 没有任何优势。但是,由于嵌套表的大小不是固定的,当静态列表在未来不可避免地发生变化时,嵌套表更加灵活。

以上是关于Oracle 过程 'out' 'table of varchar2' 类型参数的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch 错误“RuntimeError: index out of range: 试图访问索引 512 out of table with 511 rows”

java - 如何将table%rowtype的oracle pl/sql out参数引用为java中的对象

Linux下安装oracle快结束的时候报错 ORA-27102:out of memory ORA-01034:ORACLE not a availab

Oracle Schema Objects——Tables——Overview of Tables

oracle type is table of rowtype和rowtype的区别

ORACLE 错误案例—ORA-27102: out of memory