有关DBLINK的问题,是否是BUG?

hebo2005 2011-03-08 09:16:13
最近遇到一个问题,有关DBLINK的,
环境如下:
ERP数据库:10.2.0.4 AIX系统
业务数据库10.2.0.4 LINUX系统
因业务系统需要访问ERP系统的数据,帮建立了个DBLINK访问ERP,并且在业务系统中建立了同义词
今天发生了以下情况
语句如下:
SELECT b.cust_id, e.cust_id                                        --e.cust_id
FROM (SELECT j.cust_id,
j.ORD_QTY,
j.ORD_AMT,
j.ord_id
FROM tb_aj002@erp_order j, tb_ag001@erp_order b
WHERE j.ord_stat_cd = '60'
AND j.good_id = b.good_id(+)
AND j.chg_cd IS NULL
AND j.gift_cd IS NULL
AND j.jjg_good_yn = 'N'
AND j.etr_date >=
TO_DATE ('2010-01-31', 'yyyy-MM-dd HH24:mi:ss')
AND j.etr_date <=
TO_DATE ('2010-02-01', 'yyyy-MM-dd HH24:mi:ss')
AND TO_CHAR (b.lclss_id) || TO_CHAR (b.mclss_id) IN
('112', '113', '114', '121', '122', '123', '111') --and j.cust_id='1002002'
) b,
cust_erp e
WHERE b.cust_id = e.CUST_ID


这样一句语句,其中cust_erp里的CUST_id (主键)都是唯一的,没有重复的,里层SQL出来的数据是506条,但全部执行完,是3697条
实际上由于CUST_ID是唯一的,最终的结果应该是506条
我试了下,把里层 AND j.good_id = b.good_id(+) 改成
AND j.good_id = b.good_id 或者 AND j.good_id(+) = b.good_id都是506条

然后另外做了个试验
在ERP系统里也建了cust_erp表,并同步过来,并执行语句
SELECT b.cust_id, e.cust_id                                        --e.cust_id
FROM (SELECT j.cust_id,
j.ORD_QTY,
j.ORD_AMT,
j.ord_id
FROM tb_aj002 j, tb_ag001 b
WHERE j.ord_stat_cd = '60'
AND j.good_id = b.good_id(+)
AND j.chg_cd IS NULL
AND j.gift_cd IS NULL
AND j.jjg_good_yn = 'N'
AND j.etr_date >=
TO_DATE ('2010-01-31', 'yyyy-MM-dd HH24:mi:ss')
AND j.etr_date <=
TO_DATE ('2010-02-01', 'yyyy-MM-dd HH24:mi:ss')
AND TO_CHAR (b.lclss_id) || TO_CHAR (b.mclss_id) IN
('112', '113', '114', '121', '122', '123', '111') --and j.cust_id='1002002'
) b,
cust_erp e
WHERE b.cust_id = e.CUST_ID


结果是506条数据

也就是说,这两条语句队了用了个DBLINK的差异外还有CUST_ERP表在不同的库里外,其它实际上是没有差别的
但结果却出现不同
怀疑是DBLINK的BUG
...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gelyon 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhuomingwang 的回复:]
[/Quote]
根本没有外在的客观因素,因为我把那些关联表重新备份成另外的表,也就是说不涉及我们ERP系统程式逻辑流程情况下,数据条数固定情况下,也是相同的结果,
但是后来又没发生条数不定的情况了
实在是不好下手去找原因,我们老大以及我们DBA都找不出为什么。
最后还是不了了之。。。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gelyon 的回复:]
咋你也遇到数据条数不一样的情况哦?
呵呵
照你这么一说,还真有点奇怪,之前我遇到的一个问题也是出现子查询的数据条数和最后结果不一致,很简单的create table as select ....
我觉得你还是看看执行计划,到底两种情况下是不是一样,还有就是你dblink查询是否是稳定的每次都是3697条
还是偶尔是3697条,偶尔是506条
我之前的问题就是不稳定的,你可以看看:
ht……
[/Quote]
是什么原因导致这个不稳定的知道吗?
我们系统也用了好几个dblink目前还没有出现这样的问题
gelyon 2011-03-09
  • 打赏
  • 举报
回复
咋你也遇到数据条数不一样的情况哦?
呵呵
照你这么一说,还真有点奇怪,之前我遇到的一个问题也是出现子查询的数据条数和最后结果不一致,很简单的create table as select ....
我觉得你还是看看执行计划,到底两种情况下是不是一样,还有就是你dblink查询是否是稳定的每次都是3697条
还是偶尔是3697条,偶尔是506条
我之前的问题就是不稳定的,你可以看看:
http://topic.csdn.net/u/20110223/10/b1c134bc-6cde-4e85-9138-0e7e775f8604.html
minitoy 2011-03-09
  • 打赏
  • 举报
回复
把(+)去掉两个语句的结果一样么?
minitoy 2011-03-09
  • 打赏
  • 举报
回复
神奇,两个语句是一样的。
没遇到过类似情况。
iqlife 2011-03-09
  • 打赏
  • 举报
回复
感觉不太可能,至少没有遇到过,用DBLINK用的多了,都没有发现这个问题,肯定是语句上有问题,造成了重复数据的选取,建议看看多出哪些数据,

然后分析这些数据是否有规律,怀疑语句或者表关系没有理解清楚造成的
hebo2005 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 minitoy 的回复:]

把(+)去掉两个语句的结果一样么?
[/Quote]
首先,从业务逻辑上来说,用(+)和不用结果是一样的,因为我们aj002和ag001里的good_id是全部匹配的
其实,目前测试出来的数据每次都是一样的,在DBLINK的库上测试每次都是里层SQL出来506条,加上外层关联3697条
可以看到里面有句注释掉的CUST_ID,这个ID在3967的纪录里是有的,但随便哪一层,单独加上cust_id=1002002这个条件,均查不出来数据
再次,同样的语句,换到我的ERP库里
即cust_erp 表是两个数据库里都有,并且是完全同步的,aj002,ag001这两张表访问的是同一个地方,唯一的差别,ERP里是本地访问,业务库里是通过DBLINK访问

业务库出来的就是3967,ERP库出来的就是506
hebo2005 2011-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhuomingwang 的回复:]

内层查询结果 不要去别名为b
换一个与其他表别名不一样的别名试试

看看执行计划看看什么情况
[/Quote]
这个应该没关系的,原始语句是用G做别名的,并且是用Left join 的写法
同样的语句同样的表,同样的数据,不通过DBLINK和用DBLINK结果不一样
ilovemk 2011-03-08
  • 打赏
  • 举报
回复
dblink在连接查询中会有问题,这个我也遇到过。
  • 打赏
  • 举报
回复
内层查询结果 不要去别名为b
换一个与其他表别名不一样的别名试试

看看执行计划看看什么情况

17,086

社区成员

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

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