我如何使用 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
我如何将 '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