XML / SQL查询问题

时间:2014-01-25 19:12:00

标签: sql xml oracle

问题

编写SQL命令以创建表BookHistory。该表应该有一个标题列来存储一个字符串并且是一个主键,以及一个类型为XMLType的bookDetails列。编写第二个SQL命令来选择标题,并从bookDetails中选择XML节点'/ author / telephoneNumber',其中XML节点'/ author / surname'是'Chan'。

答案/尝试

CREATE TABLE BookHistory(
title varchar(20) PRIMARY KEY,
bookDetails XMLType);

SELECT title, XMLQuery(/author/telephoneNumber/text()
PASSING bookDetails RETURNING CONTENT)
FROM BookHistory
WHERE extractValue(bookDetails,'/author/surName') = 'Chan';

错误     ORA-00936:缺少表达

有人可以解释我做错了什么。这是我第一次做xml / sql。

1 个答案:

答案 0 :(得分:1)

需要引用XMLQuery()的第一个参数XQuery_string

SELECT title, XMLQuery('/author/telephoneNumber/text()' as telephoneNumber
PASSING bookDetails RETURNING CONTENT)
FROM BookHistory
WHERE extractValue(bookDetails,'/author/surName') = 'Chan';

摆脱了你的错误;我认为它给出了你想要的结果......但是仍然是XMLType。

你也可以这样做:

SELECT title,
 extractValue(bookDetails, '/author/telephoneNumber') as telephoneNumber
FROM BookHistory
WHERE extractValue(bookDetails,'/author/surName') = 'Chan';

SQL Fiddle第二个版本;第一个版本没有错误,但在那个环境中由于某些原因没有返回,但是在11.2.0.3下我们都运行正常,并给出相同的结果;样本数据:

insert into bookhistory values ('Some title',
 XMLType('
<author>
 <surName>Chan</surName>
 <telephoneNumber>1234</telephoneNumber>
</author>
'));

insert into bookhistory values ('Another book',
 XMLType('
<author>
 <surName>Segal</surName>
 <telephoneNumber>5678</telephoneNumber>
</author>
'));

两者都给:

TITLE                TELEPHONENUMBER
-------------------- --------------------
Some title           1234

但是第一个版本返回一个XMLType,它在SQL * Plus中显示如上,但在SQLDeveloper中没有;你应该真正得到实际的文本值:

SELECT title, XMLQuery('/author/telephoneNumber/text()'
PASSING bookDetails RETURNING CONTENT).getStringVal() as telephoneNumber
FROM BookHistory
WHERE extractValue(bookDetails,'/author/surName') = 'Chan';

TITLE                TELEPHONENUMBER    
-------------------- --------------------
Some title           1234                 
两个工作版本的

SQL Fiddle