我如何使用 plsql 将 'a,b,c' 转换为 'a'、'b'、'c'

How i can transformate thats 'a,b,c' in that 'a','b','c' with plsql

我如何将 'a,b,c' 转换为 'a','b','c' 与 plsql,因为在我的程序中我需要使用 "in" 创建一个 "where" 但我无法通过 '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;

也许你可以使用这样的东西

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 查询中使用的内容

如果我对这种情况的理解正确,您想要构建一个函数,以在 SQL 语句 WHERE 子句中使用。一种方法是使用流水线 table 函数,查看您的代码,我想您知道那是什么。

因此您需要将 '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')))

这有帮助吗?

谢谢,我可以解决我的问题 这留下了: select regexp_substr(P_CLASE, '[^,]+', 1, level) 结果 来自 DUAL 按级别连接 <= length(regexp_replace(P_CLASE, '[^,]+')) + 1