Хранимая процедура Oracle, разделение VARCHAR и обработка случаев - PullRequest
0 голосов
/ 16 октября 2018

У меня есть небольшая проблема с этим, желаю, чтобы кто-то мог помочь.

У меня есть эта хранимая процедура:

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;

Моя проблема в том, что я не знаю, как справиться, когдапараметр IN "vOrigen" - это всего лишь регистр, или если это два параметра, которые мне нужно разделить, чтобы выполнить, источник этой хранимой процедуры находится в случае "HOTEL", потому что мне нужно получить ORIGIN для завершения оператора select.

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Еще один способ разбить комбинации параметров "NOTA" или "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 голосов
/ 16 октября 2018

Когда vOrigen имеет значение «HOTEL, CUN» и вы хотите использовать «HOTEL» в случае и «CUN» в выборе, вы можете попробовать что-то вроде этого:

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;
...