【问题标题】:How to save XML file in PL/SQL database如何在 PL/SQL 数据库中保存 XML 文件
【发布时间】:2020-06-10 22:42:25
【问题描述】:

我需要将我已经存储在 FTP 位置的 XML 文件的文本存储在数据库中表的字段中,我正在使用包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;

在哪里CMTT_CODE默认保存值15,TEXT保存XML文件的名称和TEXT_NAR所有内容,我的意思是所有 XML 表格中的文本MNT

我仍然无法在TEXT_NAR表格字段MNT中插入所有XML文本。

我正在努力坚持我的“保持简单”的理念,但我对这一切并不熟悉,非常感谢一些关于最佳方式的反馈。

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

【问题讨论】:

  • 您无法将文件从本地客户端加载到数据库。该文件需要驻留在数据库服务器上。
  • PL/SQL 在数据库服务器的上下文中运行,因此它只能访问服务器有权访问的文件..
  • 这个过程会发生一次还是多次?您是否能够访问数据库服务器以将文件放在那里?为什么/为什么不?
  • 您的客户端操作系统是什么?你有安装 bash/cygwin 吗?
  • 您已经大幅更改了问题 - 对于回答原始版本的人来说这似乎不太公平,最好为 FTP 提出一个新问题。无论如何....在您发布的代码中,您从未将值分配给p_textp_text_nar - 您希望它们包含什么?另外,为什么要循环并从 XML 中获取行并单独存储它们 - 您不希望将整个 XML 文档存储为单个值吗?

标签: xml oracle plsql


【解决方案1】:

当您处于 环境中时,这里有一个 解决方案。

给定some.xml 文件喜欢。

<?xml version="1.0"?>
<root>
<listitem someattribute='thingOne'>content One</listitem>
<listitem someattribute='thingTwo'>content Two</listitem>
<listitem someattribute='thingThree'>content Three</listitem>
</root>

还有一张桌子MYTABLE 喜欢:

Name           Null?    Type               
-------------- -------- ------------------ 
COLUMNONE               VARCHAR2(25)         
COLUMNTWO               VARCHAR2(25)       

我将使用 PowerShell 脚本 (xml2csv.ps1),例如:

#read from file
[xml]$inputFile = Get-Content -Path some.xml

#Walk through the records
$inputFile.root.ChildNodes | 
    # re-map to column names using ScriptBlock(s)
    Select-Object @{Name=’columnOne’; Expression={$_.someattribute}},@{Name=’columnTwo’; Expression={$_.'#text'}} |
        # write out CSV file
        Export-Csv -Path some.csv -NoTypeInformation -Encoding:UTF8

powershell.exe xml2csv.ps1 运行它

使用 SQLcl 加载数据库(从 https://www.oracle.com/tools/downloads/sqlcl-downloads.html 下载或包含在 SQL Developer 中)并运行 LOAD 命令 (https://www.thatjeffsmith.com/archive/2019/09/sqlcl-and-the-load-csv-command/)。

启动会话sql.exe myuser/mypassword@MYDATABASE 并执行:

LOAD MYTABLE some.csv

【讨论】:

    【解决方案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
    

    如下运行:

    bash the_script.sh the_source_data.xml

    【讨论】:

    • 我尝试用UTL_FILE包做,但还是无法在表格中插入数据
    • 这个问题现在与原来的问题完全不同,所以我上面的回答不再适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多