Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Sql 如何从以前的xml查询结果中进行选择_Sql_Xml_Subquery_Oracle11g_Xmltype - Fatal编程技术网

Sql 如何从以前的xml查询结果中进行选择

Sql 如何从以前的xml查询结果中进行选择,sql,xml,subquery,oracle11g,xmltype,Sql,Xml,Subquery,Oracle11g,Xmltype,我正在使用oracle 11g r2数据库,基本上需要能够解析并从中选择一些节点。我花了数小时在网上搜索,阅读oracle xml db手册,试图为我的问题找到合适的解决方案,但我似乎无法确定正确的方法。我有相当一点编程经验,但没有xml、sql或oracle数据库方面的经验,所以如果这是一个小问题,请原谅 好的,接下来是问题: 我有一个非常简单的XML文件,保存为catalog.XML,如下所示: <catalog> <cd> <title

我正在使用oracle 11g r2数据库,基本上需要能够解析并从中选择一些节点。我花了数小时在网上搜索,阅读oracle xml db手册,试图为我的问题找到合适的解决方案,但我似乎无法确定正确的方法。我有相当一点编程经验,但没有xml、sql或oracle数据库方面的经验,所以如果这是一个小问题,请原谅

好的,接下来是问题:

我有一个非常简单的XML文件,保存为catalog.XML,如下所示:

<catalog>
    <cd>
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <country>UK</country>
        <company>CBS Records</company>
        <price>9.90</price>
        <year>1988</year>
    </cd>
    <cd>
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <country>USA</country>
        <company>Columbia</company>
        <price>10.90</price>
        <year>1985</year>
    </cd>
</catalog>
CREATE TABLE BINARY OF XMLType XMLTYPE STORE AS BINARY XML;
然后,我继续通过以下方式将xml文件加载到oracle中:

insert into BINARY values (XMLTYPE(BFILENAME ('XML_DIR','catalog.xml'),nls_charset_id('AL32UTF8')));
到目前为止还不错

现在来看摘录部分:

首先我尝试:

SELECT extract(b.object_value, '/catalog/cd/title')
FROM binary b
WHERE existsNode(b.object_value,'/catalog/cd[artist="Bob Dylan"]') = 1;

EXTRACT(B.OBJECT_VALUE,'/CATALOG/CD/TITLE')
--------------------------------------------------------------------------------

<Title>Hide your heart</Title>
<Title>Empire Burlesque</Title>

1 row selected.
SELECT value(d)
FROM binary b,
table (xmlsequence(extract(b.object_value,'/catalog/cd'))) d
WHERE existsNode(b.object_value,'/catalog/cd[artist="Bob Dylan"]') = 1;

VALUE(D)
--------------------------------------------------------------------------------

<cd>
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <country>UK</country>
    <company>CBS Records</company>
    <price>9.90</price>
    <year>1988</year>
</cd>

<cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
</cd>

2 rows selected.
但是,sql*plus显示了一个错误:

ORA-00904: "SUB1": invalid identifier.
我尝试了几十种尝试使用子查询的变体,但我似乎无法正确使用它

我听说您也可以使用变量或pl/sql来实现这一点,但我不确定从哪里开始

任何帮助都将不胜感激,因为我已经尝试了所有可以使用的方法。

这应该可以:

SELECT EXTRACTVALUE (VALUE(xml), '*/title') title
  FROM TABLE (XMLSEQUENCE (EXTRACT (XMLTYPE ('
        <catalog>
        <cd>
            <title>Hide your heart</title>
            <artist>Bonnie Tyler</artist>
            <country>UK</country>
            <company>CBS Records</company>
            <price>9.90</price>
            <year>1988</year>
        </cd>
        <cd>
            <title>Empire Burlesque</title>
            <artist>Bob Dylan</artist>
            <country>USA</country>
            <company>Columbia</company>
            <price>10.90</price>
            <year>1985</year>
        </cd>
        </catalog>'), '/catalog/cd'))) xml
WHERE EXTRACTVALUE (VALUE(xml), '*/artist') = 'Bob Dylan';
这样做的目的是将所有
cd
节点提取到虚拟表
xml
,为存在的每个
cd
节点返回一个结果行。WHERE子句然后通过查看子元素
artist
=“Bob Dylan”来限制结果,SELECT语句仅解析
title
元素的内容,而不是显示整个节点

输出为:

TITLE
----------------
Empire Burlesque
SELECT EXTRACTVALUE (VALUE(xml), '*/title') title
  FROM binary b,
       TABLE (XMLSEQUENCE (EXTRACT (b.object_value, '/catalog/cd'))) xml
 WHERE EXTRACTVALUE (VALUE(xml), '*/artist') = 'Bob Dylan';
TITLE
----------------
Empire Burlesque