【问题标题】:How can I return a SELECT query with an oracle function?如何使用 oracle 函数返回 SELECT 查询?
【发布时间】:2021-06-03 19:41:51
【问题描述】:

我需要创建一个函数,它允许我返回与 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


【解决方案1】:

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

    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));

【讨论】:

  • 谢谢,管道函数似乎正是我想要的。为了将来参考,这个问题的答案也很有帮助stackoverflow.com/questions/53634630/…
  • 自Oracle 12c 起,不再需要使用table() 运算符,SQL 解析器在查询的任何部分直接理解function()
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2020-02-26
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多