miércoles, 1 de noviembre de 2023

plsql split string by comma and pivot to column

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;

/***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;