最近遇到一个问题,有关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

解决方案 »

  1.   

    dblink在连接查询中会有问题,这个我也遇到过。
      

  2.   

    这个应该没关系的,原始语句是用G做别名的,并且是用Left join 的写法
    同样的语句同样的表,同样的数据,不通过DBLINK和用DBLINK结果不一样
      

  3.   

    感觉不太可能,至少没有遇到过,用DBLINK用的多了,都没有发现这个问题,肯定是语句上有问题,造成了重复数据的选取,建议看看多出哪些数据,然后分析这些数据是否有规律,怀疑语句或者表关系没有理解清楚造成的
      

  4.   

    咋你也遇到数据条数不一样的情况哦?
    呵呵
    照你这么一说,还真有点奇怪,之前我遇到的一个问题也是出现子查询的数据条数和最后结果不一致,很简单的create table as select ....
    我觉得你还是看看执行计划,到底两种情况下是不是一样,还有就是你dblink查询是否是稳定的每次都是3697条
    还是偶尔是3697条,偶尔是506条
    我之前的问题就是不稳定的,你可以看看:
    http://topic.csdn.net/u/20110223/10/b1c134bc-6cde-4e85-9138-0e7e775f8604.html
      

  5.   

    是什么原因导致这个不稳定的知道吗?
    我们系统也用了好几个dblink目前还没有出现这样的问题
      

  6.   

    根本没有外在的客观因素,因为我把那些关联表重新备份成另外的表,也就是说不涉及我们ERP系统程式逻辑流程情况下,数据条数固定情况下,也是相同的结果,
    但是后来又没发生条数不定的情况了 
    实在是不好下手去找原因,我们老大以及我们DBA都找不出为什么。
    最后还是不了了之
      

  7.   

    首先,从业务逻辑上来说,用(+)和不用结果是一样的,因为我们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