Функция и курсор ПОМОЩЬ ORACLE PL / SQL - PullRequest
0 голосов
/ 31 октября 2019

Пытаясь получить этот вывод:

enter image description here

   SELECT E.ID_EMPLEADO ,E.APEMPPAT  , E.ID_JEFE   
     FROM EMPLEADOS E
     WHERE E.ID_SUCURSAL=4
     CONNECT BY PRIOR E.ID_EMPLEADO = E.ID_JEFE ;

с помощью этой функции

    CREATE OR REPLACE FUNCTION EMPLO_FUN
(V_EMPL_SUC IN EMPLEADOS.ID_SUCURSAL%TYPE) 
RETURN VARCHAR2
IS
    V_NEMP_HASR EMPLEADOS.ID_EMPLEADO%TYPE;
    V_DEP_HASR  EMPLEADOS.APEMPPAT%TYPE;
    V_JURIS_HASR EMPLEADOS.ID_JEFE%TYPE;
CURSOR C1
IS 
   SELECT E.ID_EMPLEADO ,E.APEMPPAT, E.ID_JEFE  
     INTO  V_NEMP_HASR, V_DEP_HASR, V_JURIS_HASR 
     FROM EMPLEADOS E
     WHERE E.ID_SUCURSAL=V_EMPL_SUC
     CONNECT BY PRIOR E.ID_EMPLEADO = E.ID_JEFE ;
   BEGIN

   OPEN c1;
    FETCH c1 INTO V_NEMP_HASR, V_DEP_HASR, V_JURIS_HASR;


   CLOSE c1;
   RETURN V_NEMP_HASR;
    RETURN V_DEP_HASR;
    RETURN V_JURIS_HASR;
    END;

 SELECT EMPLO_FUN (4) FROM DUAL;

Я знаю, что в основном работаетВозврат одного значения Поиск показал, что я могу использовать курсор, чтобы получить кратные значения, но мне нужна помощь, я думаю, что некоторые предложения цикла отсутствуют

1 Ответ

0 голосов
/ 31 октября 2019

В вашем запросе вы возвращаете VARCHAR2, который будет возвращать только значение. Вместо этого вы должны вернуть SYS_REFCURSOR

CREATE OR REPLACE FUNCTION EMPLO_FUN (V_EMPL_SUC IN EMPLEADOS.ID_SUCURSAL%TYPE) 
RETURN SYS_REFCURSOR
AS
    V_MYRESULT SYS_REFCURSOR;
BEGIN
    OPEN V_MYRESULT FOR
        SELECT E.ID_EMPLEADO ,E.APEMPPAT, E.ID_JEFE  
        FROM EMPLEADOS E
        WHERE E.ID_SUCURSAL=V_EMPL_SUC
        CONNECT BY PRIOR E.ID_EMPLEADO = E.ID_JEFE ;

RETURN V_MYRESULT;
END;

Тогда SELECT EMPLO_FUN (4) FROM DUAL; даст вам ожидаемый результат.

...