Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 使用光标遍历内部联接结果_Database_Oracle_Stored Procedures_Cursor - Fatal编程技术网

Database 使用光标遍历内部联接结果

Database 使用光标遍历内部联接结果,database,oracle,stored-procedures,cursor,Database,Oracle,Stored Procedures,Cursor,我对oracle数据库存储过程非常陌生,所以如果我问的是非常简单或基本的问题,请原谅 我想遍历使用游标在过程中生成的内部联接结果集 我已经创建了一个过程,它有一个简单的SQL select查询连接两个表和两个表中的选择字段 CREATE OR REPLACE PROCEDURE demoprocedure(crsr out SYS_REFCURSOR) AS BEGIN OPEN crsr FOR SELECT TABLE1

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

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

我已经创建了一个过程,它有一个简单的SQL select查询连接两个表和两个表中的选择字段

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

问题在于temp变量的声明。您可以在局部变量中获取
SYS\u REFCURSOR
的内容,然后按如下方式显示:

程序

测试它(通过它循环)


干杯

我对内部联接有问题,请再次检查问题,我已从表@tejashjoin中选择了字段。联接中的问题是什么?我看不出我需要定义任何类型resultset,因为您已经将temp定义为VARCHAR(10),因为您的查询正在返回VARCHAR(10),但是在我的示例中,我正在从两个不同的表返回4个字段,所以您能帮我如何做到这一点吗?好的,更新了答案。现在检查!!
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>