Oracle Database PLSQL
Convertir una cadena en filas mediante split y pasarlo a columnas:
DECLARE
V_CADENA VARCHAR(1000):= 'f1_col1|f1_col2|f1_col3,f2_col1|f2_col2|f2_col3,f3_col1|f3_col2|f3_col3,f4_col1|f4_col2|f4_col3';
CURSOR C_FILAS IS
select regexp_substr (
V_CADENA,
'[^,]+',
1,
level
) as valor
from dual
connect by level <=
length ( V_CADENA ) - length ( replace (V_CADENA, ',' ) ) + 1;
V_CADENA VARCHAR(1000):= 'f1_col1|f1_col2|f1_col3,f2_col1|f2_col2|f2_col3,f3_col1|f3_col2|f3_col3,f4_col1|f4_col2|f4_col3';
CURSOR C_FILAS IS
select regexp_substr (
V_CADENA,
'[^,]+',
1,
level
) as valor
from dual
connect by level <=
length ( V_CADENA ) - length ( replace (V_CADENA, ',' ) ) + 1;
/***DECLARAMOS LAS COLUMNAS QUE TIENE LA CADENA***/
COL1 VARCHAR(100);
COL2 VARCHAR(100);
COL3 VARCHAR(100);
BEGIN
/***RECORREMOS LAS FILAS DEL 1ER CURSOR***/
FOR C_FILAS_REC
IN C_FILAS
LOOP
DBMS_OUTPUT.put_line (C_FILAS_REC.valor);
/***SEPARAMOS EN ORDEN LAS COLUMNAS DE LA CADENA DE CADA FILA***/
select columna_1,columna_2,columna_3
INTO COL1,COL2,COL3 from
(select regexp_substr (
C_FILAS_REC.valor,
'[^|]+',
1,
level
) value, rownum columna
from DUAL
connect by level <=
length ( C_FILAS_REC.valor ) - length ( replace ( C_FILAS_REC.valor, '|' ) ) + 1)
PIVOT (max(value)
FOR columna IN (1 AS columna_1, 2 AS columna_2, 3 AS columna_3));
DBMS_OUTPUT.put_line (COL1);
DBMS_OUTPUT.put_line (COL2);
DBMS_OUTPUT.put_line (COL3);
END LOOP;
END;
COL2 VARCHAR(100);
COL3 VARCHAR(100);
BEGIN
/***RECORREMOS LAS FILAS DEL 1ER CURSOR***/
FOR C_FILAS_REC
IN C_FILAS
LOOP
DBMS_OUTPUT.put_line (C_FILAS_REC.valor);
/***SEPARAMOS EN ORDEN LAS COLUMNAS DE LA CADENA DE CADA FILA***/
select columna_1,columna_2,columna_3
INTO COL1,COL2,COL3 from
(select regexp_substr (
C_FILAS_REC.valor,
'[^|]+',
1,
level
) value, rownum columna
from DUAL
connect by level <=
length ( C_FILAS_REC.valor ) - length ( replace ( C_FILAS_REC.valor, '|' ) ) + 1)
PIVOT (max(value)
FOR columna IN (1 AS columna_1, 2 AS columna_2, 3 AS columna_3));
DBMS_OUTPUT.put_line (COL1);
DBMS_OUTPUT.put_line (COL2);
DBMS_OUTPUT.put_line (COL3);
END LOOP;
END;