我需要把我已经存好的一个xml文件的文本存储在一个FTP的某个位置,在数据库的一个表的一个字段中,我是用包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;
Run Code Online (Sandbox Code Playgroud)
在那里CMTT_CODE
会默认保存值15,TEXT
保存的名称XML文件,TEXT_NAR
所有的内容,我的意思是所有的XML表格中的文字MNT
我仍然无法在表字段中插入所有XML文本。TEXT_NAR
MNT
我试图坚持我保持简单的理念,但我对这一切都很陌生,并且非常感谢有关最佳方法的一些反馈。
主要错误是它没有保存XML名称以及XML文件在其相应字段中包含的内容
虽然确实最简洁的方法是将 XML 数据文件发送到数据库服务器并使用 UTL_FILE 进行加载和处理,但使用正确的工具,您可以通过某种方式来弥合客户端/服务器之间的差距。
下面概述的方法依赖于客户端脚本来构建 SQL*Plus 脚本,该脚本使用匿名块中的 XML 数据初始化 CLOB 变量,然后方便在 SQL 中使用该变量。
下面的示例是在 bash 中的 - 如果您的客户端 (WIndows) 上安装了 bash 或 Cygwin,或者您的客户端是 Linux/MacOS,这可能会对您有所帮助。如果没有,也许有人可以编写 DOS BAT/Powershell 等效程序。
这个想法是使用 XML 数据构建一个脚本,该数据作为匿名 PLSQL 块中的变量呈现,然后传递到存储过程。
这是 bash 脚本 the_script.sh:
XML_FILE=${1} # File containing XML to load
SQL_SCRIPT=the_script.sql # script we will construct to do the work
# Start constructing teh PLSQL blcok
cat <<EOF > ${SQL_SCRIPT}
declare
vx_xml XMLTYPE;
vc_xml CLOB ;
begin
vc_xml := '';
EOF
cat ${XML_FILE} | fold -80 -s | sed "s/^/ vc_xml := vc_xml || '/" | sed "s/$/';/" >> ${SQL_SCRIPT}
cat <<EOF >> ${SQL_SCRIPT}
vx_xml := XMLTYPE(vc_xml);
call_the_stored_proc(vx_xml); -- A strored procedure to process the XML data as required
end;
/
EOF
cat ${SQL_SCRIPT}
cat <<EOF > sqlplus -S /nolog
conn un/pw@db
@${SQL_SCRIPT}
quit
EOF
Run Code Online (Sandbox Code Playgroud)
按如下方式运行:
bash the_script.sh the_source_data.xml
归档时间: |
|
查看次数: |
1143 次 |
最近记录: |