如何在游标中使用嵌套表

时间:2011-12-13 07:08:22

标签: oracle stored-procedures oracle10g cursor

CREATE PROCEDURE( p_cur  OUT a_cur)
IS
type rec is record( a varchar2(2), b number, c number);
type tab is table of rec;
tab1 tab:=tab();
begin

tab1.extend;
tab1(tab1.last).a:='as';
tab1(tab1.last).b:=2;
tab1(tab1.last).c:=3;
tab1.extend;
tab1(tab1.last).a:='jj';
tab1(tab1.last).b:=2;
tab1(tab1.last).c:=3;

--??---
end;

我在这里创建了一个嵌套表tab1,但我的问题是我想在游标中使用这个嵌套表并希望使用这个嵌套表返回整个记录,限制是我不想使用任何临时表。 我正在使用RDBMS作为ORACLE

1 个答案:

答案 0 :(得分:4)

如果你想使用一个集合,就好像它是一个表格,那么你就可以看一下TABLE()函数:

这里有一个例子:http://www.dobosz.at/oracle/select-from-plsql-table/

这里有另一个好资源:http://www.databasejournal.com/features/oracle/article.php/2222781/Returning-Rows-Through-a-Table-Function-in-Oracle.htm

您需要在数据库中声明集合类型,然后在您的过程中填充它,然后从中进行选择。

我在这里使用此方法回答了一个问题:Can a table variable be used in a select statement where clause?

看看它应该可以帮助你实现你想要达到的目标。

希望它有所帮助...

编辑:在回答您的问题时,此代码应该按照您的意愿执行。我还没有对它进行测试,但它应该非常接近你所需要的,你可以根据需要进行调试。

-- Create the relevent Object
CREATE TYPE data_obj_type AS OBJECT (
   a VARCHAR2(2),
   b NUMBER,
   c NUMBER
);

创建类型

-- Create the collection to hold the objects
CREATE TYPE table_obj_type IS TABLE OF data_obj_type;

创建类型

CREATE OR REPLACE
PROCEDURE cursor_values(
   p_cur OUT sys_refcursor
)
IS
   -- Create a variable and initialise it
   tab1 table_obj_type := table_obj_type();
BEGIN
   -- Populate the tab1 collection
   tab1.extend;
   tab1(tab1.last) := data_obj_type('as', 2, 3);
   tab1.extend;
   tab1(tab1.last) := data_obj_type('jj', 2, 3);
   --
   -- Open ref_cursor for output
   OPEN p_cur FOR
      SELECT a,
             b,
             c
        FROM TABLE(CAST(tab1 AS table_obj_type));
END cursor_values; 

N.B。:这是从本页修改的代码: http://www.akadia.com/services/ora_return_result_set.html