首页 > 解决方案 > 如何从表参数中选择行到游标中

问题描述

我想将一个表参数传递给一个 Oracle 存储过程并返回一个带有表值和一些额外数据的游标,即

CREATE OR REPLACE PACKAGE EVENTPACKAGE AS
  TYPE T_STRING_TAB IS TABLE OF VARCHAR2(260) INDEX BY BINARY_INTEGER;
END;

create or replace
procedure spTest(eventids in EVENTPACKAGE.T_STRING_TAB, p_cursor in out sys_refcursor)
as
begin

  open p_cursor for 
    select * from
    (
      select *, 'test1', 'test2' from eventids
    );

end;  

因此,如果eventids包含名为“First”、“Second”和“Third”的 3 个字符串,则该过程将返回:

"First", "test1", "test2"
"Second", "test1", "test2"
"Third", "test1", "test2"

该参数是一个表格,为什么这不起作用?

标签: oracle

解决方案


几个问题:

  • 如果您还想返回其他表达式,则需要为内部 * 起别名
  • 要从 PL/SQL 数组中进行选择,您需要使用 table() 运算符

这使:

var cur refcursor;

create or replace package eventpackage as
  type t_string_tab is table of varchar2(20) 
    index by pls_integer;

  string_tab t_string_tab;
end;
/

begin
  eventpackage.string_tab(1) := 'First';
  eventpackage.string_tab(2) := 'Second';
  eventpackage.string_tab(3) := 'Third';

  open :cur for 
    select * from (
      select t.*, 'test1', 'test2' 
      from   table ( 
        eventpackage.string_tab
      ) t
    );

end;
/

print :cur;

Result Sequence      'TEST 'TEST
-------------------- ----- -----
First                test1 test2
Second               test1 test2
Third                test1 test2

推荐阅读