Oracle PL / SQL Вернуть набор записей и указать столбец c (из набора записей) в отдельной переменной - PullRequest
1 голос
/ 08 января 2020

Мне нужно вернуть значение из процедуры, набора записей и одного значения (извлечение из набора записей)

CREATE TABLE EMP
(
    EMP_ID number;
    EMP_NAME varchar2(20);
    EMP_FLAG char(1);
);

CREATE TABLE SALARY
(
    EMP_ID number;
    EMP_SAL number;
);

BEGIN
  insert into EMP values(10,'John','N');
  insert into EMP values(20,'May','Y');

  insert into SALARY values(10,10000);
  insert into SALARY values(10,25000);
END;
/

Вот моя процедура

CREATE OR REPLACE PROCEDURE TEST(Flag in char(1),curEMP out SYS_REFCURSOR,Sal out number)
  v_sal    number;   
  v_emp_id number;
  v_name   varchar2(20);                               
AS
    open curEMP for
    select e.emp_id
            ,e.emp_name
            ,s.sal
    from emp e
    left join sal s on e.emp_id  = s.emp_id
    where e.emp_flag = Flag;

    loop
        fetch curEMP into v_emp_id,v_name,v_Sal; --in real life there are more than 20+ fields
      exit when curEMP%notfound;
    end loop;
    Sal := v_sal;
END TEST;
/

Скрипт для вызова процедуры

set serveroutput on;
variable cr refcursor;
variable sal number;

exec TEST('Y',:cr,:sal);
print cr;
print sal;

Вот вывод

Вывод

sal
25000

Однако мне нужен вывод, подобный этому

- Вывод из списка курсоров

emp_id emp_name sal     
20     May   25000

- от переменной переменной

sal     
25000

1 Ответ

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

Есть несколько проблем с таблицей DDL и процедурой, но я думаю, вы все равно выполнили процедуру.

Чтобы получить все записи, вы можете использовать только cursor и открыть его в procedure, нет необходимости в looping через cursor в вашем procedure.

. См. procedure и его вызов в следующем примере:

SQL> CREATE OR REPLACE PROCEDURE TEST (
  2      FLAG     IN       CHAR, -- size can not be given in the input parameter
  3      CUREMP   OUT      SYS_REFCURSOR
  4      --SAL      OUT      NUMBER -- no need of this parameter
  5  ) AS
  6      --V_SAL      NUMBER; -- all variables are not needed
  7      --V_EMP_ID   NUMBER;
  8      --V_NAME     VARCHAR2(20);
  9  BEGIN
 10      OPEN CUREMP FOR SELECT
 11                          E.EMP_ID,
 12                          E.EMP_NAME,
 13                          S.EMP_SAL
 14                      FROM
 15                          EMP E
 16                          LEFT JOIN SALARY S ON E.EMP_ID = S.EMP_ID
 17                      WHERE E.EMP_FLAG = FLAG;
 18  --    LOOP -- looping is not needed
 19  --        FETCH CUREMP INTO
 20  --            V_EMP_ID,
 21  --            V_NAME,
 22  --            V_SAL; --in real life there are more than 20+ fields
 23  --        EXIT WHEN CUREMP%NOTFOUND;
 24  --    END LOOP;
 25
 26  --    SAL := V_SAL;
 27  END TEST;
 28  /

Procedure created.

SQL>

Сейчас тестируем процедуру.

SQL> VAR x REFCURSOR;
SQL> exec test('Y',:x);

PL/SQL procedure successfully completed.

SQL> print :x

    EMP_ID EMP_NAME                EMP_SAL
---------- -------------------- ----------
        20 May                       25000

SQL>

Ура !!

...