Tengo un pequeño problema para hacer esto, deseo que alguien pueda ayudarme.

Tengo este procedimiento almacenado:

CREATE OR REPLACE PROCEDURE FILTER_COPY(
        vOrigen IN VARCHAR2,
        sListadoClientes__ OUT SYS_REFCURSOR
       )
        IS
        vParam VARCHAR2(10);
        vQuery_final VARCHAR2(2500);
BEGIN
    DECLARE BEGIN
        FOR i IN
     (SELECT regexp_substr(vOrigen ,'[^,]+', 1, level) AS params FROM dual
             CONNECT BY regexp_substr(vOrigen, '[^,]+', 1, level) IS NOT NULL)
         LOOP
         vParam := i.params;
         END LOOP;
    CASE (vOrigen)
        WHEN 'CALLCENTER' THEN vQuery_final:= 'SELECT IDCALL as indice, NOMBRE as nombre FROM CALL ORDER BY 1';

        WHEN 'PAIS' THEN vQuery_final:= 'SELECT CODE as indice, NAME as nombre FROM PAIS WHERE CODE IN ('''|| 'CAN' ||''',''' || 'USA' ||''') ORDER BY 1';

        WHEN 'HOTEL' THEN vQuery_final:= 'SELECT HOTEL_ID as indice,NOMBRE as nombre FROM HOTEL WHERE TIPO = '' || ROYAL || '' ORDER BY 1';

        WHEN 'NOTA' THEN vQuery_final:= 'SELECT IDNOTA as indice, TIPONOTA as nombre FROM NOTAS ORDER BY 1';

        WHEN 'DEPARTAMENTO' THEN vQuery_final:= 'SELECT IDDEPTO as indice, DEPTO as nombre FROM DEPATRAMENTO WHERE MESSAGE = 1 ORDER BY 1';

    END CASE;
    -- query_final:='SELECT DUMMY  FROM DUAL';
    OPEN sListadoClientes__ FOR vQuery_final;
     --select vParam as CLIENT from dual;
  END;
END;

Mi problema es que no sé cómo manejar cuando el parámetro IN "vOrigen" es solo un caso o si hay dos parámetros que necesito dividir para lograr, el origen de este procedimiento almacenado está en el caso 'HOTEL' porque Necesito obtener el ORIGEN para completar la declaración de selección.

Gracias por su tiempo.

0
Tuxonh 16 oct. 2018 a las 19:03

2 respuestas

La mejor respuesta

Cuando vOrigen es "HOTEL, CUN" y desea utilizar "HOTEL" en caso y "CUN" en una selección, puede probar algo como esto:

declare
    vQuery_final VARCHAR2(2500);
    vOrigen varchar2(2000);
    type param_table is table of varchar2(100) index by PLS_INTEGER;
    t_param param_table;
BEGIN
    vOrigen := 'HOTEL, CUN';

    FOR i IN (SELECT regexp_substr(vOrigen ,'[^,]+', 1, level) AS params, level as nr FROM dual
         CONNECT BY regexp_substr(vOrigen, '[^,]+', 1, level) IS NOT NULL)
     LOOP
        t_param(i.nr) := trim(i.params);--delete spaces
        dbms_output.put_line(i.nr||' param='||t_param(i.nr));
     END LOOP;

    CASE (t_param(1))
        WHEN 'CALLCENTER' THEN vQuery_final:= 'SELECT IDCALL as indice, NOMBRE as nombre FROM CALLCENTER ORDER BY 1';

        WHEN 'PAIS' THEN vQuery_final:= 'SELECT CODE as indice, NAME as nombre FROM PAIS WHERE CODE IN ('''|| 'CAN' ||''',''' || 'USA' ||''') ORDER BY 1';

        WHEN 'HOTEL' THEN vQuery_final:= 'SELECT HOTEL_ID as indice,NOMBRE as nombre FROM HOTEL WHERE TIPO = ''' || t_param(2) || ''' ORDER BY 1';

        WHEN 'NOTA' THEN vQuery_final:= 'SELECT IDNOTA as indice, TNOTA as nombre FROM NOTAS ORDER BY 1';

        WHEN 'DEPARTAMENTO' THEN vQuery_final:= 'SELECT IDDEPTO as indice, DEPTO as nombre FROM DEPARTAMENTO WHERE MESSAGE = 1 ORDER BY 1';

        ELSE vQuery_final:= 'select 1 from dual';
    END CASE;

    dbms_output.put_line('vQuery_final='||vQuery_final);
END;
0
Tuxonh 16 oct. 2018 a las 21:08

Otra forma de dividir las combinaciones de parámetros "NOTA" o "HOTEL, CUN"

CREATE OR REPLACE PROCEDURE FILTER_COPY(
        vOrigen IN VARCHAR2,
        sListadoClientes__ OUT SYS_REFCURSOR
       )
        IS
   vParam VARCHAR2(10);
   vQuery_final VARCHAR2(2500);
   v_param1  varchar2(10);
   v_param2  varchar2(10);
BEGIN

SELECT  REGEXP_SUBSTR (vOrigen, '[^,]+', 1, 1) 
INTO v_param1
from dual;

SELECT  REGEXP_SUBSTR (vOrigen, '[^,]+', 1, 2)
INTO v_param2
from dual;

    CASE (v_param1)
        WHEN 'CALLCENTER' THEN vQuery_final:= 'SELECT IDCALLC as indice, NOMBRE as nombre FROM CALLCENTER ORDER BY 1';

        WHEN 'PAIS' THEN vQuery_final:= 'SELECT CODE as indice, NAME as nombre FROM PAIS WHERE CODE IN ('''|| 'CAN' ||''',''' || 'USA' ||''') ORDER BY 1';

        WHEN 'HOTEL' THEN vQuery_final:= 'SELECT HOTEL_ID as indice,NOMBRE as nombre FROM HOTEL WHERE TIPO = ''' || v_param2 || ''' ORDER BY 1';

        WHEN 'NOTA' THEN vQuery_final:= 'SELECT IDTNOTA as indice, TIPONOTA as nombre FROM NOTAS ORDER BY 1';

        WHEN 'DEPARTAMENTO' THEN vQuery_final:= 'SELECT IDDEPTO as indice, DEPTO as nombre FROM DEPARTAMENTO WHERE MESSAGE = 1 ORDER BY 1';

        ELSE vQuery_final:= 'select 1 from dual';
    END CASE;

END;
0
Tuxonh 16 oct. 2018 a las 20:39