我需要将已经存储在FTP位置的XML文件的文本存储在数据库表的字段中,我正在使用UTL_FILE
包读取文件,但我对该包的操作不是很清楚, 我刚刚开始接触 PL/SQL 的存储过程。我的现有方法是:
- 使用
UTL_FILE.FOPEN
打开文件。 - 在存储过程中创建一个
INSERT
语句以将其存储在数据库字段中。
为此,我正在编写一个PL / SQL存储过程,但我不知道它是否适合我所需的内容。
DECLARE
file BFILE;
clob CLOB;
FILE UTL_FILE.file_type;
TEXT VARCHAR2(32767);
L_CONN UTL_TCP.connection;
CODE SPRCMNT.MNTCODE%TYPE;
TEXT MNT.MNT_TEXT%TYPE;
TEXT_NAR MNT.MNT_TEXT_NAR%TYPE;
BEGIN
L_CONN := FTP.LOGIN('000.00.000.00', '00', '*********', '*********');
FTP.ASCII(P_CONN => L_CONN);
FTP.GET(P_CONN => L_CONN, p_from_file => '/xml_file/file.xml', p_to_dir => 'UPLOAD_DIR', p_to_file => 'file.xml');
ftp.logout(l_conn);
VFILE := UTL_FILE.fopen('UPLOAD_DIR', 'file.xml', 'R', 4000);
LOOP
BEGIN
UTL_FILE.GET_LINE(VFILE, TEXT, 32767);
DBMS_OUTPUT.PUT_LINE(TEXT);
INSERT INTO SPRETA (
ID,
CODE,
TEXT,
TEXT_NAR,
DATE)
VALUES('15218',
'15',
TEXT,
TEXT_NAR,
SYSDATE)
RETURN TEXT_NAR INTO l_clob;
l_bfile := BFILENAME ('UPLOAD', 'file.xml');
dbms_lob.fileopen( l_bfile, dbms_lob.FILE_READONLY );
dbms_lob.loadfromfile( l_clob, l_bfile, dbms_lob.getlength(l_bfile) );
dbms_lob.fileclose( l_bfile );
COMMIT;
EXCEPTION
WHEN OTHERS THEN EXIT;
dbms_output.put_line('Error al cargar el archivo');
END;
END LOOP;
UTL_FILE.FCLOSE(FILE);
END;
默认情况下,
CMTT_CODE
将保存值 15,TEXT
保存XML文件的名称,TEXT_NAR
保存所有内容,即表格 MNT
中的所有XML文本。我仍然无法将所有XML文本插入到
TEXT_NAR
表字段中。我试图遵循简单易懂的理念,但由于我是新手,因此真的需要一些关于最佳实践的反馈意见。
主要错误在于它没有将XML名称和XML文件包含的内容保存在其相应的字段中。
p_text
或p_text_nar
分配值 - 您希望它们包含什么? 另外,为什么要循环并获取 XML 中的行并将其单独存储 - 难道您不希望将整个 XML 文档存储为单个值吗? - Alex Poole