Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL*加载器能否处理XML?_Xml_Oracle_Upload_Sql Loader - Fatal编程技术网

Oracle SQL*加载器能否处理XML?

Oracle SQL*加载器能否处理XML?,xml,oracle,upload,sql-loader,Xml,Oracle,Upload,Sql Loader,Oracle是否提供XML格式文件的标准化上载? 我认为用于XML输出的规范格式structure=ROWSET/ROW/columname可以通过使用适当的控制文件内容运行sqlldr再次上传回表中。 但我在web上的任何地方都找不到关于这一点的任何信息,试用后的错误消息似乎表明,只有将XML上传到XML类型的格式化表中才可能,在这种情况下,我只想上传普通表中的数据,但提供XML格式的数据。不,SQL*Loader只能处理平面文件 一种选择是编写XSLT转换,将行集/行/列格式转换为文本文件,

Oracle是否提供XML格式文件的标准化上载? 我认为用于XML输出的规范格式structure=ROWSET/ROW/columname可以通过使用适当的控制文件内容运行sqlldr再次上传回表中。
但我在web上的任何地方都找不到关于这一点的任何信息,试用后的错误消息似乎表明,只有将XML上传到XML类型的格式化表中才可能,在这种情况下,我只想上传普通表中的数据,但提供XML格式的数据。

不,SQL*Loader只能处理平面文件

一种选择是编写XSLT转换,将行集/行/列格式转换为文本文件,然后将其导入目标表


另一个选项是将XML导入单行,然后使用Oracle的XML函数从该暂存表中选择一个关系结果,并将其插入到实际表中。

没有标准化选项,但使用此特定格式可以执行此操作。如果您有一张桌子:

CREATE TABLE test_tab (
    id NUMBER,
    text VARCHAR2(50)
);
以及test_tab.xml文件中的记录:

你可以做:

sqlldr usr/pwd control=test_tab.ctl

Commit point reached - logical record count 4

SELECT * FROM test_tab;

        ID TEXT
---------- --------------------------------------------------
         1 This is some text
         2 This is some more text
         3 This is some other text
         4 This is also some text
如果将Oracle可以看到的目录放入,也可以从同一文件创建外部表:

CREATE TABLE test_tab (
    id NUMBER,
    text VARCHAR2(50)
)
ORGANIZATION EXTERNAL
(
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY some_dir
    ACCESS PARAMETERS
    (
        RECORDS DELIMITED BY "</ROW>"
        FIELDS
        (
            dummy CHAR(15) TERMINATED BY "<ROW>",
            id CHAR(10) ENCLOSED BY "<ID>" AND "</ID>",
            text CHAR(40) ENCLOSED BY "<TEXT>" AND "</TEXT>"
        )
    )
    LOCATION ('test_tab.xml')
)
PARALLEL
REJECT LIMIT UNLIMITED;

Table created.

SELECT * FROM test_tab;

    ID TEXT
---------- --------------------------------------------------
     1 This is some text
     2 This is some more text
     3 This is some other text
     4 This is also some text

好的-那么,现在又回到使用带有正确选择的列分隔符的文件了。遗憾的是,这有点出乎意料——这是对Oracle的一个提示,在11.3中添加了此功能:-。Oracle希望有所不同:@SeanB.Durkin:这些示例是关于将XML文件或片段的内容加载到单个XMLType列中的。它不是解析XML结构并将单个标记的内容放入不同的列中。SQLLoader无法将XML:42Arthur处理为表personid,name绝对是一个不错的选择。我会记住这一点,以便以后可能使用!测试了在into table one之后添加一个append关键字,以确保将行添加到非空表中,并像一个符咒一样工作!只要XML文档包含诸如“&;之类的实体,此操作就会失败,或者。@jambjo-奇怪的是,只有当存在多个这样的实体时,它才似乎有问题,而且我不知道为什么它会有问题,因为它们是经过编码的。这仍然适用于警告,因此我认为这取决于所使用的数据类型。很好的理解,有趣的一点是,空节点是如何处理的?例如,如果你有3个?给定示例控制文件,SQLLDR将对此进行呕吐。
sqlldr usr/pwd control=test_tab.ctl

Commit point reached - logical record count 4

SELECT * FROM test_tab;

        ID TEXT
---------- --------------------------------------------------
         1 This is some text
         2 This is some more text
         3 This is some other text
         4 This is also some text
CREATE TABLE test_tab (
    id NUMBER,
    text VARCHAR2(50)
)
ORGANIZATION EXTERNAL
(
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY some_dir
    ACCESS PARAMETERS
    (
        RECORDS DELIMITED BY "</ROW>"
        FIELDS
        (
            dummy CHAR(15) TERMINATED BY "<ROW>",
            id CHAR(10) ENCLOSED BY "<ID>" AND "</ID>",
            text CHAR(40) ENCLOSED BY "<TEXT>" AND "</TEXT>"
        )
    )
    LOCATION ('test_tab.xml')
)
PARALLEL
REJECT LIMIT UNLIMITED;

Table created.

SELECT * FROM test_tab;

    ID TEXT
---------- --------------------------------------------------
     1 This is some text
     2 This is some more text
     3 This is some other text
     4 This is also some text