首页 > 解决方案 > 生成.txt文件并插入到oracle表pl/sql中

问题描述

我有一个程序可以在单个变量中接收文件的内容,然后将其分成几行并划分以逗号分隔的每一行的字段,所有这些过程我都正确地完成了,但是现在我必须生成一个包含一些特定内容的新文件我之前看到所有使用 utl_file write 写入文件的字段,但我想将它插入到表中而不是 FTP 服务器中。是否有可能做到这一点?如果是,那么最好的方法是什么?

CREATE OR replace PROCEDURE process_file (filecontent CLOB) 
AS 
  contador NUMBER := 0; 
BEGIN 
    FOR i IN (SELECT Trim (column_value) l 
              FROM   dual, 
                     XMLTABLE ( ('"'|| replace (filecontent, '\r\n', '","')||'"'))) 
    LOOP 
        FOR i2 IN (select regexp_substr(i.l,'[^,]+',1) UNIDAD, 
        regexp_substr(i.l,'[^,]+',1,2) PERIODO, 
        regexp_substr(i.l,'[^,]+',1,3) COMPANIA, 
        regexp_substr(i.l,'[^,]+',1,4) ID_ORGANIZACION,
        regexp_substr(i.l,'[^,]+',1,5) ID_LIBRO_CONTABLE,
        regexp_substr(i.l,'[^,]+',1,6) ID_PERSONA_REG,
        regexp_substr(i.l,'[^,]+',1,7) NUMERO_EMPLEADO_REG,
        regexp_substr(i.l,'[^,]+',1,8) ID_PERSONA_DIS,
        regexp_substr(i.l,'[^,]+',1,9) NUMERO_EMPLEADO_DIS,
        regexp_substr(i.l,'[^,]+',1,10) ID_PERSONA_SUP,
        regexp_substr(i.l,'[^,]+',1,11) NUMERO_EMPLEADO_SUP,
        regexp_substr(i.l,'[^,]+',1,12) ID_PERSONA_GTE,
        regexp_substr(i.l,'[^,]+',1,13) NUMERO_EMPLEADO_GTE,
        regexp_substr(i.l,'[^,]+',1,14) NUMERO_EMPLEADO_CHEFF_GTE,
        regexp_substr(i.l,'[^,]+',1,15) COMENTARIOS,
        regexp_substr(i.l,'[^,]+',1,16) TIPO_SUPERVISOR,
        regexp_substr(i.l,'[^,]+',1,17) ID_PERSONA_CHEFF_GTE
        from dual) LOOP 
            IF(i2.UNIDAD = 'UNIDAD' 
               and i2.PERIODO = 'PERIODO' 
               and i2.COMPANIA = 'COMPANIA'
               and i2.ID_ORGANIZACION = 'ID_ORGANIZACION'
               and i2.ID_LIBRO_CONTABLE = 'ID_LIBRO_CONTABLE'
               and i2.ID_PERSONA_REG = 'ID_PERSONA_REG'
               and i2.NUMERO_EMPLEADO_REG = 'NUMERO_EMPLEADO_REG'
               and i2.ID_PERSONA_DIS = 'ID_PERSONA_DIS'
               and i2.NUMERO_EMPLEADO_DIS = 'NUMERO_EMPLEADO_DIS'
               and i2.ID_PERSONA_SUP = 'ID_PERSONA_SUP'
               and i2.NUMERO_EMPLEADO_SUP = 'NUMERO_EMPLEADO_SUP'
               and i2.ID_PERSONA_GTE = 'ID_PERSONA_GTE'
               and i2.NUMERO_EMPLEADO_GTE = 'NUMERO_EMPLEADO_GTE'
               and i2.NUMERO_EMPLEADO_CHEFF_GTE = 'NUMERO_EMPLEADO_CHEFF_GTE'
               and i2.COMENTARIOS = 'COMENTARIOS'
               and i2.TIPO_SUPERVISOR = 'TIPO_SUPERVISOR'
               and i2.ID_PERSONA_CHEFF_GTE = 'ID_PERSONA_CHEFF_GTE')THEN
            dbms_output.Put_line ('No se procesan los cabeceros');
            ELSE
            dbms_output.Put_line ('UNIDAD : ' 
                                  || i2.UNIDAD 
                                  || Chr (10)); 
            dbms_output.Put_line ('PERIODO : ' 
                                  || i2.PERIODO 
                                  || Chr (10)); 
            dbms_output.Put_line ('COMPANIA : ' 
                                  || i2.COMPANIA 
                                  || Chr (10)); 
            dbms_output.Put_line ('ID_ORGANIZACION : ' 
                                  || i2.ID_ORGANIZACION 
                                  || Chr (10));
            dbms_output.Put_line ('ID_LIBRO_CONTABLE : ' 
                                  || i2.ID_LIBRO_CONTABLE 
                                  || Chr (10));  
            dbms_output.Put_line ('ID_PERSONA_REG : ' 
                                  || i2.ID_PERSONA_REG 
                                  || Chr (10)); 
            dbms_output.Put_line ('NUMERO_EMPLEADO_REG : ' 
                                  || i2.NUMERO_EMPLEADO_REG 
                                  || Chr (10)); 
            dbms_output.Put_line ('ID_PERSONA_DIS : ' 
                                  || i2.ID_PERSONA_DIS 
                                  || Chr (10)); 
            dbms_output.Put_line ('NUMERO_EMPLEADO_DIS : ' 
                                  || i2.NUMERO_EMPLEADO_DIS 
                                  || Chr (10)); 
            dbms_output.Put_line ('ID_PERSONA_SUP : ' 
                                  || i2.ID_PERSONA_SUP 
                                  || Chr (10)); 
            dbms_output.Put_line ('NUMERO_EMPLEADO_SUP : ' 
                                  || i2.NUMERO_EMPLEADO_SUP 
                                  || Chr (10)); 
            dbms_output.Put_line ('ID_PERSONA_GTE : ' 
                                  || i2.ID_PERSONA_GTE 
                                  || Chr (10)); 
            dbms_output.Put_line ('NUMERO_EMPLEADO_GTE : ' 
                                  || i2.NUMERO_EMPLEADO_GTE 
                                  || Chr (10)); 
            dbms_output.Put_line ('NUMERO_EMPLEADO_CHEFF_GTE : ' 
                                  || i2.NUMERO_EMPLEADO_CHEFF_GTE 
                                  || Chr (10)); 
            dbms_output.Put_line ('COMENTARIOS : ' 
                                  || i2.COMENTARIOS 
                                  || Chr (10)); 
            dbms_output.Put_line ('TIPO_SUPERVISOR : ' 
                                  || i2.TIPO_SUPERVISOR 
                                  || Chr (10));
            dbms_output.Put_line ('ID_PERSONA_CHEFF_GTE : ' 
                                  || i2.ID_PERSONA_CHEFF_GTE 
                                  || Chr (10));
            dbms_output.Put_line ('***Termina línea***' 
                                  || Chr (10));
            END IF;          
        END LOOP; 
    END LOOP; 
END;

并运行:

DECLARE
    var_FILECONTENT   CLOB;
BEGIN
    var_FILECONTENT := 'UNIDAD,PERIODO,COMPANIA,ID_ORGANIZACION,ID_LIBRO_CONTABLE,ID_PERSONA_REG,NUMERO_EMPLEADO_REG,ID_PERSONA_DIS,NUMERO_EMPLEADO_DIS,ID_PERSONA_SUP,NUMERO_EMPLEADO_SUP,ID_PERSONA_GTE,NUMERO_EMPLEADO_GTE,NUMERO_EMPLEADO_CHEFF_GTE,COMENTARIOS,TIPO_SUPERVISOR,ID_PERSONA_CHEFF_GTE\r\n0101,42125,2525,300000001698016,78563,300000002861315,22,4855,e4730,155,e855,455,255,7525,Test_procedure,P,1525\r\n';

    TOKS_HCM_PROCESS_FILE (FILECONTENT => var_FILECONTENT);

END;

标签: oraclestored-proceduresplsqloracle-apexutl-file

解决方案


我想将它插入到表格中

你为什么不这样做呢?不要在屏幕上显示值(使用DBMS_OUTPUT.PUT_LINE),而是使用INSERT命令。程序的其余部分——如果运行良好——不必修改。

像这样的东西(简化):

CREATE OR replace PROCEDURE process_file (filecontent CLOB) 
AS 
  contador NUMBER := 0; 
BEGIN 
    FOR i IN (SELECT Trim (column_value) l 
              FROM   dual, 
                     XMLTABLE ( ('"'|| replace (filecontent, '\r\n', '","')||'"'))) 
    LOOP 
        FOR i2 IN (select regexp_substr(i.l,'[^,]+',1) UNIDAD, 
                          regexp_substr(i.l,'[^,]+',1,2) PERIODO, 
                          regexp_substr(i.l,'[^,]+',1,3) COMPANIA, ...
                    from dual
                   ) LOOP 
            IF(    i2.UNIDAD   = 'UNIDAD' 
               and i2.PERIODO  = 'PERIODO' 
               and i2.COMPANIA = 'COMPANIA' ...
              ) THEN
               dbms_output.Put_line ('No se procesan los cabeceros');
            ELSE
--> this is what you need
               insert into target_table(unidad, periodo, compania, ...)
                  values (i1.unidad, i2.periodo, i2.compania, ...);
--> end of what you need                  
            END IF;          
        END LOOP; 
    END LOOP; 
END;

推荐阅读