生成.txt文件并插入到oracle表pl/sql中
Posted
技术标签:
【中文标题】生成.txt文件并插入到oracle表pl/sql中【英文标题】:Generate .txt file and insert it into an oracle table pl / sql 【发布时间】:2019-06-17 23:48:06 【问题描述】:我有一个过程,它在单个变量中接收文件的内容,我将它分成几行,并用逗号分隔每行的字段,所有这些过程我都做对了,但现在我必须生成一个新文件对于分割的一些特定字段,我以前看到所有写入文件都使用 utl_file 写入,但我想将它插入到表中而不是 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;
【问题讨论】:
【参考方案1】:我想把它插入到表格中
你为什么不这样做呢?不要在屏幕上显示值(使用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;
【讨论】:
嗨@Littlefoot,我想我必须做更多的过程才能将它作为文件插入,呵呵,这是我第一次使用类似的东西,但谢谢,我会去完成我的程序以上是关于生成.txt文件并插入到oracle表pl/sql中的主要内容,如果未能解决你的问题,请参考以下文章