Как я могу преобразовать это 'a, b, c' в это 'a', 'b', 'c' с помощью plsql - PullRequest
0 голосов
/ 24 мая 2019

Как я могу преобразовать 'a, b, c' как 'a', 'b', 'c' с помощью plsql, потому что в моей процедуре мне нужно сделать " где "использую" in "но я не могу передать 'a', 'b', 'c' когда я вызываю мою процедуру

Моя процедура ниже

CREATE OR REPLACE PACKAGE BODY G_JSON_RAW AS

  FUNCTION  GET_IMS_DATA(P_FECHA_DESDE      IN  VARCHAR2,
                        P_FECHA_HASTA       IN  VARCHAR2,
                        P_CLASE             IN  VARCHAR2,
                        P_NOMBRE_PROYECTO   IN  VARCHAR2)
                        RETURN NOKIA_JSON_RAW_TAB PIPELINED IS
     BEGIN
    FOR DATO IN (

      SELECT /*+ MATERIALIZE PARALLEL(NOKIA_IMS_JSON_RAW,2) */
                        RT.NOMBRE_PROYECTO,JT.TIPO_JS,JT.FECHA_JS,JT.REGIONAL,JT.INTERVALO,JT.ELEMENTO_1,
                        JT.ELEMENTO_2,JT.CLAVE,JT.VALOR,JT.REFERENTE
                FROM
                  NOKIA_IMS_JSON_RAW RT,
                  JSON_TABLE(DOCUMENTO FORMAT JSON,'$'
                      COLUMNS
                        TIPO_JS VARCHAR2(19 CHAR)  PATH '$.tipo',
                        FECHA_JS VARCHAR2(100 CHAR) PATH '$.fecha',
                        REGIONAL  VARCHAR2(5 CHAR) PATH '$.regional',
                        INTERVALO NUMBER PATH '$.intervalo',
                        ELEMENTO_1 VARCHAR2(500 CHAR)PATH '$.elemento_1',
                        ELEMENTO_2 VARCHAR2(500 CHAR)PATH '$.elemento_2',
                        NESTED PATH '$.referencias[*]'
                          COLUMNS(
                            NESTED PATH '$.datos[*]'
                              COLUMNS(
                                CLAVE VARCHAR2(32)PATH '$.clave',
                                VALOR VARCHAR2(32)PATH '$.valor'
                              ),
                            REFERENTE VARCHAR2(100)PATH '$.referente'
                          )
                    )
                  JT
                WHERE CLASE IN (SELECT * FROM  sys.dbms_debug_vc2coll(P_CLASE))
                AND   NOMBRE_PROYECTO = P_NOMBRE_PROYECTO
                AND   FECHA BETWEEN TO_DATE(P_FECHA_DESDE,'DD.MM.YYYY HH24')
                AND   TO_DATE(P_FECHA_HASTA,'DD.MM.YYYY HH24') + 3599/86400) LOOP
      PIPE ROW(NOKIA_JSON_RAW_REC(NOMBRE_PROYECTO => DATO.NOMBRE_PROYECTO,
                                  TIPO            => DATO.TIPO_JS,
                                  FECHA           => DATO.FECHA_JS,
                                  REGIONAL        => DATO.REGIONAL,
                                  INTERVALO       => DATO.INTERVALO,
                                  ELEMENTO_1      => DATO.ELEMENTO_1,
                                  ELEMENTO_2      => DATO.ELEMENTO_2,
                                  CLAVE           => DATO.CLAVE,
                                  VALOR           => DATO.VALOR,
                                  REFERENTE       => DATO.REFERENTE));
    END LOOP;
    RETURN;
  END GET_IMS_DATA;
  --**--**--**--**--
  FUNCTION  GET_IMS_DATA_RAW(P_FECHA_DESDE      IN  VARCHAR2,
                            P_FECHA_HASTA       IN  VARCHAR2,
                            P_CLASE             IN  VARCHAR2,
                            P_NOMBRE_PROYECTO   IN  VARCHAR2,
                            P_INTERVALO         IN  NUMBER,
                            P_MEDICION          IN  VARCHAR2)
                            RETURN NOKIA_JSON_RAW_TAB PIPELINED IS
   --
  BEGIN
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD.MM.YYYY HH24:MI:SS''';
    --
    FOR DATO IN (SELECT /*+ MATERIALIZE PARALLEL(2) */
                        NOMBRE_PROYECTO,TIPO,FECHA,REGIONAL,INTERVALO,ELEMENTO_1,ELEMENTO_2,CLAVE,VALOR,REFERENTE
                FROM  GET_IMS_DATA(P_FECHA_DESDE,P_FECHA_HASTA,P_CLASE,P_NOMBRE_PROYECTO)
                WHERE REFERENTE IN(SELECT * FROM  sys.dbms_debug_vc2coll(P_MEDICION))
                AND   INTERVALO = P_INTERVALO
                ) LOOP
      PIPE ROW(NOKIA_JSON_RAW_REC(NOMBRE_PROYECTO =>  DATO.NOMBRE_PROYECTO,
                                  TIPO            =>  DATO.TIPO,
                                  FECHA           =>  DATO.FECHA,
                                  REGIONAL        =>  DATO.REGIONAL,
                                  INTERVALO       =>  DATO.INTERVALO,
                                  ELEMENTO_1      =>  DATO.ELEMENTO_1,
                                  ELEMENTO_2      =>  DATO.ELEMENTO_2,
                                  CLAVE           =>  DATO.CLAVE,
                                  VALOR           =>  DATO.VALOR,
                                  REFERENTE       =>  DATO.REFERENTE));
    END LOOP;
    RETURN;
    EXCEPTION
      WHEN NO_DATA_NEEDED THEN NULL;
      WHEN OTHERS THEN
        G_ERROR_LOG_NEW.P_LOG_ERROR('G_JSON_RAW.GET_IMS_DATA_RAW',
                                      SQLCODE,
                                      SQLERRM,
                                      'P_FECHA_DESDE => '     ||P_FECHA_DESDE||
                                      ' P_FECHA_HASTA => '    ||P_FECHA_HASTA||
                                      ' P_CLASE => '          ||P_CLASE||
                                      ' P_NOMBRE_PROYECTO => '||P_NOMBRE_PROYECTO);
  END GET_IMS_DATA_RAW;
END G_JSON_RAW;

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Если я правильно понимаю этот случай, вы хотите построить функцию, чтобы использовать в выражении SQL предложение WHERE. Один из способов сделать это - использовать конвейерную табличную функцию, глядя на ваш код, я думаю, вы знаете, что это такое.

Таким образом, вам нужно преобразовать 'a, b, c' в массив, содержащий значения 'a', 'b' и 'c'. Это можно сделать с помощью цикла WHILE, SUBSTR и INSTR.

CREATE FUNCTION convert_for_in(p_string IN VARCHAR2) 
  RETURN <TableType of VARCHAR(1)> PIPELINED IS
BEGIN
  FOR no_chr IN 1 .. (LENGTH (p_string) + 1) / 2 LOOP
    PIPE_ROW (SUBSTR(p_string, 2 * no_chr - 1, 1);
  END LOOP;
END;

и добавить к пункту WHERE

AND ... IN (SELECT * from table (convert_for_in('a,b,c')))

Помогает ли это?

0 голосов
/ 24 мая 2019

СПАСИБО, я могу решить мою проблему, это осталось: выберите regexp_substr (P_CLASE, '[^,] +', 1, level) результат от двойного соединения по уровню <= length (regexp_replace (P_CLASE, '[^,] +')) + 1 </p>

0 голосов
/ 24 мая 2019

Возможно, вы можете использовать что-то вроде этого

with data as
  (select 'a,b,c' col 
     from dual)
select regexp_substr(col, '[^,]+', 1, level) result
from data
connect by level <= length(regexp_replace(col, '[^,]+')) + 1; 

Выше будет выводиться -

RESULT
a
b
c

это то, что вы можете использовать в вашем IN запросе

...