Пройдите через результат внутреннего соединения, используя курсор - PullRequest
0 голосов
/ 22 января 2020

Я очень плохо знаком с хранимой процедурой oracle, поэтому, пожалуйста, прости меня, если я задаю очень простой или базовый c вопрос.

Я хочу просмотреть результаты внутреннего соединения набор, который был создан в процедуре с использованием курсора.

Я создал одну процедуру, которая имеет простой SQL запрос выбора, соединяющий таблицу буксировки и поля выбора из обеих таблиц.

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

1 Ответ

1 голос
/ 22 января 2020

Проблема связана с объявлением временной переменной. Вы можете извлечь содержимое 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.

Тестирование (L oop через него)

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>

Приветствия !!

...