从记录集合类型中选择数据

时间:2009-06-30 17:46:47

标签: sql oracle stored-procedures recordset

我在oracle 11g服务器上有一个存储过程,它有一个out变量的记录。我无法编辑此程序。我正在创建一个函数,它将调用该过程并返回记录集中的信息。我查看了以下问题:past question

我的问题是我可以为记录创建一种表格并直接在SQL中查询吗?或者我是否需要将记录转换为类型对象并创建表类型以便直接查询?

5 个答案:

答案 0 :(得分:3)

RECORD是一个PL / SQL概念。因此,我们无法基于RECORD创建TABLE TYPE,并在SQL语句中使用该TYPE。 SQL只识别在SQL中创建的TYPE。

因此,如果我正确理解您的场景,您需要在SQL中创建一个对象和/或嵌套表。然后,您的函数可以调用该过程并将RECORD转换为嵌套表。然后可以返回嵌套表或流水线。

答案 1 :(得分:1)

您的链接指向的问题已标记为Oracle,因此我假设您正在使用该问题。

最简单的方法可能是返回CURSOR

SQL> VAR cr_dual REFCURSOR

SQL> BEGIN
  2          OPEN    :cr_dual FOR
  3          SELECT  1
  4          FROM    dual
  5          UNION ALL
  6          SELECT  2
  7          FROM    dual;
  8  END;
  9  /

Процедура PL/SQL успешно завершена.

SQL> PRINT cr_dual

         1
----------
         1
         2

答案 2 :(得分:1)

最终为此问题做的是基于存储过程逻辑创建视图并直接从中查询。

答案 3 :(得分:0)

如果您只收到一条记录并且您知道记录定义,则应该能够直接按名称记录该字段。

例如:

TYPE myrecord IS RECORD (
       itemA NUMBER,
       itemB myTable.columnName%TYPE
  );

当你有myrecord类型的记录时,你可以用这样的方式引用itemA:

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER
IS
BEGIN    
   RETURN recordInstance.itemA;
END myFunction;

请注意,您可以在调用代码中解决此问题,只需处理原始过程返回的记录类型即可。

答案 4 :(得分:0)

你可以试试varray。

首先 -

create or replace type addr_type
as object
(name   varchar2(20)
,city   varchar2(20)
)

将你的varray创建为

create or replace type varr_addr as varray(10) of addr_type
/

现在您可以使用varr_addr返回工作。一个例子:

SQL> create or replace procedure ret_user_addr (p_out out varr_addr)
  2  is
  3  begin
  4    p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2'));
  5  end;
  6  /

Procedure created.

SQL> sho err
No errors.

现在您需要在调用的地方正确配置out变量。您可以像在表格中那样从表格(VARIABLE_NAME)中进行选择。