内部游标如何在oracle中使用外部游标的字段?

时间:2013-12-06 08:09:22

标签: oracle plsql cursor

我有两个嵌套游标。我的意思是一个光标在另一个光标内。

我想在内部光标内使用外部光标的字段。像这样的东西:

Inner_cursor.outer_cursor.outer_cursor_column;

但即使我像这样使用它也不起作用:

Inner_cursor.(outer_cursor.outer_cursor_column);

我有什么方法可以做到这一点吗?

编辑:

这是我的代码:

CREATE OR REPLACE PROCEDURE TEST1                                            
AS
    CURSOR loop_relation IS
        SELECT * FROM RELATION_table;
    relation_rec loop_relation%rowtype;
    CURSOR loop_BIG_TABLE IS
        SELECT * FROM BIG_TABLE;
    BIG_TABLE_rec loop_BIG_TABLE%rowtype;   
BEGIN
    FOR RELATION_REC IN LOOP_RELATION
    LOOP
        FOR BIG_TABLE_rec in loop_BIG_TABLE
        LOOP
            IF (BIG_TABLE_REC.RELATION_REC.DESTINATION_PK IS NULL) THEN
                UPDATE BIG_TABLE
                SET BIG_TABLE.RELATION_REC.DESTINATION_PK = (
                    SELECT RELATION_REC.SOURCE_FK FROM RELATION_REC.SOURCE_TABLE
                    WHERE RELATION_REC.SOURCE_PK = BIG_TABLE_REC.RELATION_REC.SOURCE_PK)
                WHERE BIG_TABLE_REC.ID = BIG_TABLE.ID;
            END IF;
        END LOOP;
    END LOOP;   
END TEST1;
/

我的问题在于我使用三个点(。)在内部游标中使用外部游标的值。

2 个答案:

答案 0 :(得分:1)

以下是两个嵌套游标和内部游标中使用的变量的示例。我希望它可以帮助你。

BEGIN
   FOR r_outer in (
      select tab1.field1
      from   table1 tab1 )
   LOOP
      FOR r_inner in (
         select tab2.field2
         from   table2 tab2
         where  tab2.field2 = r_outer.field1 )
      LOOP
         dbms_output.put_line(r_outer.field1);
         dbms_output.put_line(r_inner.field2);
      END LOOP;
   END LOOP;
END;

答案 1 :(得分:1)

作为参考,我创建了一个过程来显示如何在内部游标值中使用外部游标值。我希望这可以解决您的疑问。

    CREATE OR REPLACE PROCEDURE cur_inside_cur(my_cur OUT sys_refcursor)
    AS 
    CURSOR roy_cur IS
    SELECT name FROM avrajit;
    roy_cur1 roy_cur%ROWTYPE;
    BEGIN
    OPEN roy_cur;
    LOOP
    FETCH roy_cur INTO roy_cur1;
    EXIT WHEN roy_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(roy_cur1.name);
    OPEN my_cur FOR
    SELECT department FROM avrajit
    WHERE name=roy_cur1.name;
    END LOOP;
    END cur_inside_cur;

OUTPUT

var c refcursor;
begin
cur_inside_cur(:c);
end;
print c;