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

时间:2010-07-30 12:34:58

标签: sql oracle plsql

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

代码看起来有点像:

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

2 个答案:

答案 0 :(得分: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

如果将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;
/

答案 1 :(得分:0)

嗯,这在很大程度上取决于您的数据访问库。

您可以将任何SQL兼容类型作为参数返回。这包括复杂的SQL类型和集合类型。 但是大多数库根本无法处理Oracle的对象类型。

无论哪种方式,我的示例都将使用这些对象类型:

create type SomeType as object(Field1 VarChar(50));

create type SomeTypeList as table of SomeType;

当您的访问库可以处理对象类型时,您只需返回一个PL / SQL对象列表:

begin
  :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
end;

如果没有,你可以通过将此列表强制转换为select并将其结果作为游标返回来解决它:

declare
  list SomeTypeList;
begin
  list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
  open :yourCursor for
    SELECT A
    FROM   table(list);
end;