【发布时间】:2020-06-10 22:42:25
【问题描述】:
我需要将我已经存储在 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所有内容,我的意思是所有 XML 表格中的文本MNT
我仍然无法在TEXT_NAR表格字段MNT中插入所有XML文本。
我正在努力坚持我的“保持简单”的理念,但我对这一切并不熟悉,非常感谢一些关于最佳方式的反馈。
主要错误是它没有保存 XML 名称以及 XML 文件在其相应字段中包含的内容
【问题讨论】:
-
您无法将文件从本地客户端加载到数据库。该文件需要驻留在数据库服务器上。
-
PL/SQL 在数据库服务器的上下文中运行,因此它只能访问服务器有权访问的文件..
-
这个过程会发生一次还是多次?您是否能够访问数据库服务器以将文件放在那里?为什么/为什么不?
-
您的客户端操作系统是什么?你有安装 bash/cygwin 吗?
-
您已经大幅更改了问题 - 对于回答原始版本的人来说这似乎不太公平,最好为 FTP 提出一个新问题。无论如何....在您发布的代码中,您从未将值分配给
p_text或p_text_nar- 您希望它们包含什么?另外,为什么要循环并从 XML 中获取行并单独存储它们 - 您不希望将整个 XML 文档存储为单个值吗?