使用游标遍历内部连接结果

Traverse through inner join result using cursor

我是 oracle 数据库存储过程的新手,所以如果我问的是非常简单或基本的问题,请原谅我。

我想遍历使用游标在过程中生成的内部连接结果集。

我创建了一个程序,它有一个简单的 SQL select 查询连接来自 table 的 table 和 selection 字段。

CREATE OR REPLACE PROCEDURE demoprocedure(crsr out SYS_REFCURSOR)  
AS 
      BEGIN
      OPEN crsr FOR
        SELECT 
            TABLE1.field1, TABLE2.field2, TABLE1.fields11, TABLE2.field22
        FROM 
            TABLE1 INNER JOIN   
            TABLE2   
        ON 
            TABLE1.field12 = TABLE2.field12
END demoprocedure;

我想用游标遍历这个结果集,这是我试过的

DECLARE
  crsr SYS_REFCURSOR;
  temp SYS_REFCURSOR;
BEGIN
  demoprocedure(crsr);
  LOOP
    FETCH crsr INTO temp;
        EXIT WHEN crsr%NOTFOUND;
        Dbms_Output.Put_Line('Fields1 is : ' || temp.field1);
  END LOOP;
  CLOSE crsr;
END;

但这不起作用,我已经尝试创建自定义对象,但也出现错误。

预期结果:

Fields1 is : 1
Fields1 is : 2
Fields1 is : 3

问题出在临时变量的声明上。你可以在局部变量中获取SYS_REFCURSOR的内容,然后显示如下:

程序:

SQL> CREATE OR REPLACE PROCEDURE DEMOPROCEDURE (
  2      CRSR OUT   SYS_REFCURSOR
  3  ) AS
  4  BEGIN
  5      OPEN CRSR FOR SELECT
  6                        'ABC' AS COL1,
  7                        'BCD' AS COL2,
  8                        'CDE' AS COL3,
  9                        'DEF' AS COL4
 10                    FROM
 11                        DUAL;
 12
 13  END DEMOPROCEDURE;
 14  /

Procedure created.

正在测试(循环)

SQL> SET SERVEROUT ON;
SQL> DECLARE
  2      CRSR     SYS_REFCURSOR;
  3      V_COL1   VARCHAR2(100);
  4      V_COL2   VARCHAR2(100);
  5      V_COL3   VARCHAR2(100);
  6      V_COL4   VARCHAR2(100);
  7  BEGIN
  8      DEMOPROCEDURE(CRSR);
  9      LOOP
 10          FETCH CRSR INTO
 11              V_COL1,
 12              V_COL2,
 13              V_COL3,
 14              V_COL4;
 15          EXIT WHEN CRSR%NOTFOUND;
 16          DBMS_OUTPUT.PUT_LINE('Fields1 is : ' || V_COL1);
 17          DBMS_OUTPUT.PUT_LINE('Fields2 is : ' || V_COL2);
 18          DBMS_OUTPUT.PUT_LINE('Fields3 is : ' || V_COL3);
 19          DBMS_OUTPUT.PUT_LINE('Fields4 is : ' || V_COL4);
 20      END LOOP;
 21
 22      CLOSE CRSR;
 23  END;
 24  /
Fields1 is : ABC
Fields2 is : BCD
Fields3 is : CDE
Fields4 is : DEF

PL/SQL procedure successfully completed.

SQL>

干杯!!