如何从Oracle中的declare/begin/end块返回行?

Tho*_*att 15 sql oracle plsql

我想从declare/begin/end块中的select语句返回行.我可以在T-SQL中执行此操作,但我想知道如何在PL/SQL中执行此操作.

代码看起来有点像下面这样:

declare
     blah number := 42;
begin
     select *
     from x
     where x.value = blah;
end;
Run Code Online (Sandbox Code Playgroud)

Dav*_*sta 11

一个匿名的PL/SQL块,就像你展示的一样,不能"返回"任何东西.但是,它可以通过绑定变量与调用者进行交互.

所以我在这种情况下使用的方法是声明一个游标引用,在PL/SQL块中打开它以获得所需的查询,然后让调用的应用程序从中获取行.在SQLPlus中,这看起来像:

variable rc refcursor

declare
     blah number := 42;
begin
  open :rc for
     select *
     from x
     where x.value = blah;
end;
/

print x
Run Code Online (Sandbox Code Playgroud)

如果将PL/SQL重铸为存储函数,则它可以返回值.在这种情况下,您可能要做的是创建一个集合类型,将所有行提取到该类型的变量中,然后返回它:

CREATE TYPE number_table AS TABLE OF NUMBER;

CREATE FUNCTION get_blah_from_x (blah  INTEGER)
  RETURN number_table
  IS
    values  number_table;
  BEGIN
    SELECT id
      BULK COLLECT INTO values
      FROM x
      WHERE x.value = blah;
    RETURN values;
  END;
/
Run Code Online (Sandbox Code Playgroud)