如何在 PL/SQL 数据库中保存 XML 文件

Joh*_*Doe 6 xml oracle plsql

我需要把我已经存好的一个xml文件的文本存储在一个FTP的某个位置,在数据库的一个表的一个字段中,我是用包UTL_FILE来读取文件的,我不是很清楚的操作包,我只是从PL/SQL 中的过程主题开始。我迄今为止的方法是:

  1. 使用UTL_FILE.FOPEN打开文件。
  2. 创建一个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_NARMNT

我试图坚持我保持简单的理念,但我对这一切都很陌生,并且非常感谢有关最佳方法的一些反馈。

主要错误是它没有保存XML名称以及XML文件在其相应字段中包含的内容

Ten*_*enG 2

虽然确实最简洁的方法是将 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