问题
编写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。
答案 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
两个工作版本的