2017-08-17 11 views
0

对不起,问题的名字,我会给你一个更具体的例子。存储LOOP每次迭代的数据并将它们全部返回到ref cursor?

var1 VARCHAR(20); 
var2 VARCHAR(20); 

    --MYRECORD CONTAINS COLUMNS ELEMENT0, VAL 

    FOR MYRECORD IN EXPLICITCURSOR LOOP 
    SELECT COL1, COL2 INTO var1, var2 FROM table1 WHERE table1.COLUMNT=MYRECORD.VAL; 
    END LOOP; 

正如你可以看到我有一个循环和里面我有一个选择。现在,为了进行测试,我将结果保存到每次都覆盖的两个变量中。 我需要保存在每次迭代(ELEMENT0,COL1,COL2),我会给他们的输出与REF CURSOR。

编辑1:我正在寻找在这个时刻定义一个记录和我的记录类型的表的可能性。任何人都可以为我举个例子吗?我在设置表格作为输出参数时遇到问题。 这是我在包装的开始准备的。

TYPE my_record is RECORD(
    ELEMENT0  varchar2(20), 
    COL1   varchar2(20), 
    COL2   varchar2(20)); 

TYPE my_table IS TABLE OF my_record; 

和现在我使用的是OUT参数为我的过程是这样的:

TABLERESULT       OUT my_table 

我想插入我的三个VARCHAR值我OUT PARAM内部在每次循环这种方式(值正确设置好的):

INSERT INTO TABLERESULT(ELEMENT0,COL1,COL2) VALUES(ELEMENT0,COL1,COL2); 

,它给我的错误:

PL/SQL: ORA-00942: table or view does not exist 

我做错了使用这种类型的OUT参数?

有什么建议吗?谢谢。 (我正在使用Oracle 11g)

编辑2:在@APC的帮助下,我发现命名错误,现在编译器不会给出问题。我会继续,我会让你知道的。

+0

保存在哪里?一张桌子?一份文件? –

+0

“保存”我的意思是说,我需要一种方式来存储这些三个varchar2值的东西像一个数组,然后返回所有的参考光标的过程调用者。你能建议一种方法来做到这一点? –

+0

将它们插入临时表中? –

回答

0

创建一个与您的记录结构相匹配的对象类型。

创建这些对象类型的嵌套表类型。

对于每个字符串连接符,添加到数组中。

然后返回一个游标变量如下:

OPEN CV FOR SELECT FROM TABLE(my_array); RETURN cv;

表函数将数组转换为可以分配给游标变量的结果集。

这里有一个LiveSQL脚本,将运行代码的链接,你看下面: https://livesql.oracle.com/apex/livesql/file/content_FFTOKNC4AHGPOQE79FF76S7EQ.html

CREATE OR REPLACE TYPE three_ot 
    AUTHID DEFINER IS OBJECT 
(
    element0 VARCHAR2 (200), 
    col1 VARCHAR2 (200), 
    col2 VARCHAR2 (200) 
) 
/

CREATE OR REPLACE TYPE three_nt IS TABLE OF three_ot 
/

CREATE OR REPLACE FUNCTION data_for_you 
    RETURN SYS_REFCURSOR 
    AUTHID DEFINER 
IS 
    l_cursor SYS_REFCURSOR; 
    l_nt  three_nt; 
BEGIN 
    SELECT three_ot (TO_CHAR (employee_id), last_name, first_name) 
    BULK COLLECT INTO l_nt 
    FROM hr.employees; 

    OPEN l_cursor FOR SELECT * FROM TABLE (l_nt); 

    RETURN l_cursor; 
END; 
/

DECLARE 
    l_cursor SYS_REFCURSOR := data_for_you(); 
    l_three three_ot; 
    element0 VARCHAR2 (200); 
    col1  VARCHAR2 (200); 
    col2  VARCHAR2 (200); 
BEGIN 
    LOOP 
     FETCH l_cursor INTO element0, col1, col2; 
     EXIT WHEN l_cursor%NOTFOUND; 
     DBMS_OUTPUT.put_line (col1); 
    END LOOP; 

    CLOSE l_cursor; 
END; 
/
+0

好的,就像我在编辑中说的,在这一刻我在前两个问题上有问题。如果你能找到一些时间,那么知道我可以如何实现这一点,可能会让人惊讶。谢谢。 –

0

这里这可以简单,无需任何迭代来实现。 希望下面的代码有助于。请原谅任何语法错误,因为我没有任何工作空间来执行此命令。

--Wwhat i would suggest is rather going row-by-row this can be achieved by single iteration and can be returnedas ref cursor as output. 

DECLARE 
    lv sys.odcivarchar2list; 
    lv_ref sys_refcursor; 
BEGIN 
    SELECT val BULK COLLECT 
    INTO lv 
    FROM TABLE2; 

    OPEN lv_ref FOR SELECT * FROM TABLE1 WHERE TABLE1.COL IN 
    (SELECT COLUMN_VALUE FROM TABLE(lv) 
); 
END; 
/
+0

我同意。在我的例子中,我也使用批量收集而不是循环。是的,你可以离开TABLE并仅仅引用这个集合。尚未适应相对较新的增强。太好了! –

相关问题