使用游标遍历内部连接结果
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>
干杯!!
我是 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>
干杯!!