如何使用 oracle 函数返回 SELECT 查询?

问题描述 投票:0回答:2

我需要创建一个函数,它允许我返回与 SELECT 查询相同的结果,并且包含 pl/sql 代码。

我尝试了一些非常简单的东西:

create or replace FUNCTION test
  RETURN SYS_REFCURSOR
IS
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc
   FOR SELECT *
         FROM my_table;
  RETURN l_rc;
END;

但是当我使用

SELECT test from dual;
调用我的函数时,我会在单个单元格中获得
my_table
的所有结果,而不是将每一列分开。

有办法做我想做的事吗?

理想情况下,我想要一个视图,但似乎无法添加逻辑条件。

sql oracle plsql
2个回答
6
投票

该函数必须是流水线的。例如:

    TYPE MyType IS RECORD(ID NUMBER);   
    TYPE MyTableType IS TABLE OF MyType;       
    
    Function MyFunction(Arguments) return MyTableType pipelined is     
        Cursor Cur is select * from whetever;
        R Cur%rowtype;
    Begin
        Open cur;
        loop
            fetch Cur into R;
            exit when Cur%notfound;
            pipe row(R);
        End loop;
        Close cur;
    End MyFunction;

然后您可以通过以下方式调用:

    select * from table(MyFunction(Arguments));

3
投票

最简单的方法是让函数保持原样,只正确调用它:

create table my_table (id, memo) as
    select 1, 'some memo' from dual
/
create or replace function MyTableById (id int) return sys_refcursor is
    rc sys_refcursor;
begin
    open rc for 
        select * from my_table where id=MyTableById.id;
    return rc;
end;
/

var rc refcursor
exec :rc := MyTableById (1);
print rc

        ID MEMO     
---------- ---------
         1 some memo
© www.soinside.com 2019 - 2024. All rights reserved.