数据库高手来啊!为何oracle10g数据库总是查询失败?

redcony 2008-01-02 05:39:27
有一个表的字段XML_INFO是Xml消息体,使用
SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
EXTRACTVALUE(VALUE(Y), '/name/given-name')
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile/name'))) Y
查询结果为空,实际上表里面是有N条满足条件的记录的,但使用

SELECT
KEY, USER_URI,
EXTRACTVALUE(VALUE(X), '/user-profile/@open-level'),
EXTRACTVALUE(VALUE(X), '/user-profile/display-name'),
EXTRACTVALUE(VALUE(X), '/user-profile/birth-date'),
FROM AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X
就没有问题,可以查询出多条记录,

请高人看看是怎么回事??
...全文
172 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Croatia 2008-01-12
  • 打赏
  • 举报
回复
你最初写出来的帖子,我想,已经证明了我的说法了。赫赫。
Croatia 2008-01-12
  • 打赏
  • 举报
回复
兜了这么大圈子,才明确LZ到底想要什么。
和你的最初的表述差很多呀。

据我所知,应该是得不到记录的才是正确的。得到记录的,我倒是觉得奇怪。
缺少了[/user-profiles/user-profile/name]这个标签,
等于让Y就是一个空表。

语句中的 EXTRACTVALUE(VALUE(Y), '/name/given-name')
根本没有办法找到的。
因为没有[/user-profiles/user-profile/name/given-name]这个标签。

Oracle还没有这么聪明可以自动识别到这个地步吧。赫赫。
原因很简单。假如在两个标签下存在同样名称的子标签,突然少了上层标签,怎么来分辨呢。

可不可以给出你的XML的部分数据,我在我这里看看呢。
不过,我还是认为,真的和你说的一样的话,应该是找不出来的。
redcony 2008-01-11
  • 打赏
  • 举报
回复
对,完全正确。
Croatia 2008-01-10
  • 打赏
  • 举报
回复
我们再确认一下。

在两个机器上,同样的数据同样的SQL,一个机器上面得到了结果,一个没有得到结果。

1。同样的数据是说
都是有'/user-profile/display-name'这个标签,没有[/user-profiles/user-profile/name]这个标签。

2。同样的SQL是说
不是你最初说的2个SQL,而都是你写的第一个SQL句子。

是这样的问题嘛?

redcony 2008-01-09
  • 打赏
  • 举报
回复
我明白你说的,可实际情况就是这样
数据中只有'/user-profile/display-name'这个标签,[/user-profiles/user-profile/name]这个标签是没有的。
关键是为何在另一台数据库中能查询出来?

Croatia 2008-01-08
  • 打赏
  • 举报
回复
赫赫,不是这个[/user-profiles/user-profile/name]没有吗?
怎么变成了[/user-profile/display-name]。

假如是[/user-profile/display-name]没有的话,还影响不到你抽取出来的数据的件数。

你不是也说了,你的第二种做法是可以取得出记录嘛?

不知道解释了这么多,LZ是不是明白了。赫赫。
redcony 2008-01-07
  • 打赏
  • 举报
回复
就是啊,数据都是一样的,只有'/user-profile/display-name'这个标签,其它的都没有,但一个数据库可以查询到记录,另外一个就是查询不出记录
Croatia 2008-01-06
  • 打赏
  • 举报
回复
你不是想说,你的查询语句一样,而且数据也一样吧。都是没有Name标签的。

这样的话,我想你再确认一下比较好。

在没有Name标签的时候,就应该都选择不出记录。
在有Name标签的时候,能够选择出记录。
Croatia 2008-01-06
  • 打赏
  • 举报
回复
这个是SQL的基础,
除非你使用了左外连接,完全连接才有记录。
在其中一个表里面没有数据的情况下,自然连接得不到记录的。
这个就是你的两个句子,一个可以取到记录,一个不可以的原因。

不管是XML数据库,还是大家常见的数据库,道理都是一样的。
Croatia 2008-01-06
  • 打赏
  • 举报
回复
赫赫,看来你还是没有明白。
这个不是Oracle的设置。
而是SQL本身的语法。

Select .. From A,B 这样的做法,当A,B两个表都有记录的时候,
比如说,
1.A里面有3条,B里面有2条,那么就会有3*2=6条记录。是一个笛卡尔积。 ------------ M1
2.A里面有3条,B里面有0条,那么就会有3*0=0条记录。 ------------ M2

Select .. From A Left Outer Join B这样的做法,不管B里面有几条,就算一条都没有,也会显示出3条记录。------------ M3
Select .. From A 这样的做法,也不会管B里面有几条,就算一条都没有,也会显示出3条记录。 ------------ M4

这次你的做法,看起来就是缺少了一个Name标签,换句话说,实际上就等于。B里面有记录还是没有记录。
对于你的第一种做法:
你可以选择出来记录的原因,因为你有Name标签,而且有记录,就是M1状况。
你不能选择出来记录的原因,因为你每有Name标签,就等于没有记录,就是M2状况。

对于你的第二种做法:
他们就是M4情况,怎么都不会受到B的影响的。
Croatia 2008-01-06
  • 打赏
  • 举报
回复
因为name标签没有定义,换句话说,就是y里面没有记录。
和X连接起来,当然没有数据了。赫赫。
Croatia 2008-01-06
  • 打赏
  • 举报
回复
赫赫,那么你的given-name都定义在什么地方了呢?赫赫。
redcony 2008-01-06
  • 打赏
  • 举报
回复
你说的确实有道理,
可是实际上两个数据库上的查询语句都是一样的,select ... from AA_XML,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile'))) X,
TABLE(XMLSEQUENCE(EXTRACT(XML_INFO, '/user-profiles/user-profile/name'))) Y

难道是oracle有什么设置?对于from A,B这样的语句默认处理方式不一样???
redcony 2008-01-05
  • 打赏
  • 举报
回复
发现规律了,查询不出的记录是因为name标签在xml消息体里面没有定义。

如果定义了name标签就可以查询出来。

很奇怪,同样的数据在另外一台数据库服务器上就可以。
redcony 2008-01-05
  • 打赏
  • 举报
回复
楼上的,确实是这样的,只有name标签没定义,但其他标签及其父标签是有值的,这样查询出来的记录里面name字段是空就是了。

其他地方都一样,建库的脚本都是一样的。
Croatia 2008-01-05
  • 打赏
  • 举报
回复
没有定义name标签,等于没有记录呀。

你可以找出来的服务器,我才是佩服。赫赫。
是不是还有什么地方不一样呢?
Croatia 2008-01-04
  • 打赏
  • 举报
回复
有没有y这个表才是关键呀。没有的话,就是等价连接。
是不是应该确认一下呢?
没有指定条件的情况下,系统会用自己默认的条件来关联。
bjt_ 2008-01-03
  • 打赏
  • 举报
回复
xml的查询,不懂,帮顶
無名VF 2008-01-03
  • 打赏
  • 举报
回复
呵 不懂 帮顶,关注ING。。。。。
redcony 2008-01-03
  • 打赏
  • 举报
回复
没人知道啊???

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧