最近遇到一个问题,有关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
环境如下:
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
解决方案 »
- 请教大家:如何在存储过程中创建,SELECT,INSERT,然后再DROP掉这个表呢?
- 急!急!oracle存储过程里,定义字符串后,赋值含有decode的会不支持呢,为什么呢,请赐教!
- 将表纵向编程横向展示的问题
- 求助:java连接局域网中的oracel,为什么连不上?谢谢
- 在ORACALE9 中怎么样写SQL语句,删除同一表中的相同记录,只保留一条数据。
- 如何同时取得一个数据库两个表中的所有数据?
- pl/sql
- 请问ORA-00472 PMON process terminated with error的 错误怎么解决?
- 如何通过isqlplus访问数据库??
- oracle的时间比较问题,他的时间处理真的那么麻烦吗?
- 在SqlServer触发器中, 'MSDASQL '分布式事务无法启动.....!
- 请问PL/SQL能否判断当前为最后记录
同样的语句同样的表,同样的数据,不通过DBLINK和用DBLINK结果不一样
呵呵
照你这么一说,还真有点奇怪,之前我遇到的一个问题也是出现子查询的数据条数和最后结果不一致,很简单的create table as select ....
我觉得你还是看看执行计划,到底两种情况下是不是一样,还有就是你dblink查询是否是稳定的每次都是3697条
还是偶尔是3697条,偶尔是506条
我之前的问题就是不稳定的,你可以看看:
http://topic.csdn.net/u/20110223/10/b1c134bc-6cde-4e85-9138-0e7e775f8604.html
我们系统也用了好几个dblink目前还没有出现这样的问题
但是后来又没发生条数不定的情况了
实在是不好下手去找原因,我们老大以及我们DBA都找不出为什么。
最后还是不了了之
其实,目前测试出来的数据每次都是一样的,在DBLINK的库上测试每次都是里层SQL出来506条,加上外层关联3697条
可以看到里面有句注释掉的CUST_ID,这个ID在3967的纪录里是有的,但随便哪一层,单独加上cust_id=1002002这个条件,均查不出来数据
再次,同样的语句,换到我的ERP库里
即cust_erp 表是两个数据库里都有,并且是完全同步的,aj002,ag001这两张表访问的是同一个地方,唯一的差别,ERP里是本地访问,业务库里是通过DBLINK访问业务库出来的就是3967,ERP库出来的就是506