【发布时间】:2015-05-28 14:36:40
【问题描述】:
我有一个 XMLTYPE 列,其中包含类似的 XML 结构但具有不同的命名空间。我正在尝试通过使用带有 extractValue 运算符的动态命名空间字符串从不同行的 XML 中提取一些值,但到目前为止我无法使其工作。
更明确地说,这是我要运行的查询:
SELECT extractValue(X.XML, '/ns1:a', 'xmlns:ns1="'||XSD.NAMESPACE||'"')
FROM XML_TEST X
JOIN XSD_TEST XSD ON X.XSD_ID = XSD.ID
这里是创建表和数据的 SQL:
CREATE TABLE XSD_TEST (NAMESPACE VARCHAR2(1024), ID NUMBER(19) PRIMARY KEY);
CREATE TABLE XML_TEST(XML XMLTYPE, XSD_ID NUMBER(19));
ALTER TABLE XML_TEST ADD CONSTRAINT FK_XSD_ID FOREIGN KEY(XSD_ID) REFERENCES XSD_TEST(ID);
INSERT INTO XSD_TEST (NAMESPACE, ID) VALUES ('http://my.test/v1', 1);
INSERT INTO XSD_TEST (NAMESPACE, ID) VALUES ('http://my.test/v2', 2);
INSERT INTO XML_TEST (XML, XSD_ID) VALUES (XMLTYPE('<?xml version="1.0" encoding="UTF-8" standalone="no"?><v1:a xmlns:v1="http://my.test/v1">TEST1</v1:a>'), 1);
INSERT INTO XML_TEST (XML, XSD_ID) VALUES (XMLTYPE('<?xml version="1.0" encoding="UTF-8" standalone="no"?><v2:a xmlns:v2="http://my.test/v2">TEST2</v2:a>'), 2);
如果我跑步:
SELECT extractValue(X.XML, '/ns1:a', 'xmlns:ns1="'||XSD.NAMESPACE||'"')
FROM XML_TEST X
JOIN XSD_TEST XSD ON X.XSD_ID = XSD.ID
WHERE X.XSD_ID = 1
它正确地返回 TEST1。
如果我跑步:
SELECT extractValue(X.XML, '/ns1:a', 'xmlns:ns1="'||XSD.NAMESPACE||'"')
FROM XML_TEST X
JOIN XSD_TEST XSD ON X.XSD_ID = XSD.ID
WHERE X.XSD_ID = 2
它正确返回 TEST2。
但是如果我运行:
SELECT extractValue(X.XML, '/ns1:a', 'xmlns:ns1="'||XSD.NAMESPACE||'"')
FROM XML_TEST X
JOIN XSD_TEST XSD ON X.XSD_ID = XSD.ID;
它返回 TEST1 和 (null)
谁能告诉我为什么我会得到这样的结果以及我如何才能真正得到“正确”的结果:TEST1 和 TEST2?
【问题讨论】:
-
我从您的最终查询中得到 TEST1 和 TEST2。在 11gR2 (11.2.0.3) 中;但在 10gR2 (10.2.0.5) 中 TEST1 和 null。您在哪个版本中获得 null?
-
@AlexPoole 我使用 Oracle 12
-
那令人惊讶;除了 extractValue 当然不推荐使用。 XMLQuery 和 XMLTable 版本在 11gR2 中对我有用,那么在 12c 中它们可能对你有用吗?我没有 12c 实例来测试它们。
-
@AlexPoole 谢谢,很高兴知道。您是否知道
existsNode和extractValue的等价物(或多或少),或者有一个链接可以为我指明正确的方向?
标签: sql xml oracle namespaces xmltype