|
|
我也遇到了这个BUG,但我是在10.2.0.2.0版中遇到的,相同的数据放到10.2.0.1.0中就没有
[php]
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.2.0
Connected as yykf
SQL>
SQL> --1、首先进行查询
SQL> select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
2 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
3 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
4 '0' AS STATE,'电力已记账银行未记账' AS SM,
5 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
6 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
7 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
8 FROM bank_serial C
9 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
10 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
11 AND NOT EXISTS
12 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
13 WHERE D.Bank_Serial = '04'
14 AND TRUNC(D.chk_date) = to_date('2007-06-04', 'YYYY-MM-DD')
15 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
16 bank_serial_detail B
17 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
18 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
YHXH PAY_SERIAL_NBR DFID FYBDID JE WYJ TYPE STATE SM CHK_DATE KHBH CLBZ YHWDH YHGYH
-------------------------------- ------------------------- --------------- --------------- ---------- ----------------- -------------------------------- -------------------------------- -------------------------------- ----------- ------------ -------------------------------- ---------- ----------
04 000015434 020000066274265 020000037982645 149.3 0.0000 0 0 电力已记账银行未记账 2007-6-4 0201744281 未处理 371986284 A02
SQL> --2、将刚才的查询出来的结果插入到某个数据表中
SQL> insert into BANK_CHECK_RESULT(bank_serial,Pay_Serial_Nbr,dfid,fybdid,power_fee,late_fee,TYPE,
2 state,sm,chk_date,khbh,clbz,yhwdh,yhgyh)
3 select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
4 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
5 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
6 '0' AS STATE,'电力已记账银行未记账' AS SM,
7 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
8 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
9 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
10 FROM bank_serial C
11 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
12 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
13 AND NOT EXISTS
14 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
15 WHERE D.Bank_Serial = '04'
16 AND TRUNC(D.chk_date) = to_date('2007-06-04', 'YYYY-MM-DD')
17 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
18 bank_serial_detail B
19 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
20 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
31 rows inserted
SQL> --此时却出现了31条记录插入
SQL> rollback;
Rollback complete
SQL> --3、用相同的SELECT语句去创建一个临时表
SQL> create table tmp as
2 select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
3 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
4 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
5 '0' AS STATE,'电力已记账银行未记账' AS SM,
6 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
7 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
8 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
9 FROM bank_serial C
10 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
11 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
12 AND NOT EXISTS
13 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
14 WHERE D.Bank_Serial = '04'
15 AND TRUNC(D.chk_date) = to_date('2007-06-04', 'YYYY-MM-DD')
16 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
17 bank_serial_detail B
18 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
19 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
Table created
SQL> select count(1) from tmp;
COUNT(1)
----------
1
SQL> truncate table tmp;
Table truncated
SQL>
SQL> --4、还是往刚才创建的并TRUNCATE TABLE后的临时表中插入
SQL> insert into tmp
2 select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
3 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
4 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
5 '0' AS STATE,'电力已记账银行未记账' AS SM,
6 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
7 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
8 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
9 FROM bank_serial C
10 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
11 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
12 AND NOT EXISTS
13 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
14 WHERE D.Bank_Serial = '04'
15 AND TRUNC(D.chk_date) = to_date('2007-06-04', 'YYYY-MM-DD')
16 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
17 bank_serial_detail B
18 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
19 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
31 rows inserted
SQL> --依然是31条记录
SQL>
SQL> --5、再次单独执行
SQL> select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
2 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
3 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
4 '0' AS STATE,'电力已记账银行未记账' AS SM,
5 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
6 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
7 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
8 FROM bank_serial C
9 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
10 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
11 AND NOT EXISTS
12 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
13 WHERE D.Bank_Serial = '04'
14 AND TRUNC(D.chk_date) = to_date('2007-06-04', 'YYYY-MM-DD')
15 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
16 bank_serial_detail B
17 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
18 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
YHXH PAY_SERIAL_NBR DFID FYBDID JE WYJ TYPE STATE SM CHK_DATE KHBH CLBZ YHWDH YHGYH
-------------------------------- ------------------------- --------------- --------------- ---------- ----------------- -------------------------------- -------------------------------- -------------------------------- ----------- ------------ -------------------------------- ---------- ----------
04 000015434 020000066274265 020000037982645 149.3 0.0000 0 0 电力已记账银行未记账 2007-6-4 0201744281 未处理 371986284 A02
SQL> --单独执行还是1条记录
SQL> rollback;
Rollback complete
SQL>
SQL> --6、修改一下NOT EXISTS中的语句再单独执行
SQL> select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
2 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
3 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
4 '0' AS STATE,'电力已记账银行未记账' AS SM,
5 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
6 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
7 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
8 FROM bank_serial C
9 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
10 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
11 AND NOT EXISTS
12 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
13 WHERE D.Bank_Serial = '04'
14 AND TRUNC(D.chk_date) =
15 /*to_date('2007-06-04', 'YYYY-MM-DD') 将这个值改为与C表关联*/
16 to_date(c.zwrq, 'YYYY-MM-DD')
17 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
18 bank_serial_detail B
19 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
20 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
YHXH PAY_SERIAL_NBR DFID FYBDID JE WYJ TYPE STATE SM CHK_DATE KHBH CLBZ YHWDH YHGYH
-------------------------------- ------------------------- --------------- --------------- ---------- ----------------- -------------------------------- -------------------------------- -------------------------------- ----------- ------------ -------------------------------- ---------- ----------
04 000015434 020000066274265 020000037982645 149.3 0.0000 0 0 电力已记账银行未记账 2007-6-4 0201744281 未处理 371986284 A02
SQL>
SQL> --7、修改一下NOT EXISTS中的语句再插入试试
SQL> insert into tmp
2 select '04' yhxh, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID,
3 DECODE(A.state, 1, A.PAY_AMOUNT, B.POWER_FEE) JE, B.LATE_FEE wyj,
4 DECODE(A.State, 0, DEcode(nvl(B.FYBDID, '1'), '1', '2', '0'),A.state) TYPE,
5 '0' AS STATE,'电力已记账银行未记账' AS SM,
6 to_date('2007-06-04', 'YYYY-MM-DD') AS CHK_DATE,
7 A.khbh, '未处理' clbz, A.YHWDH, A.YHGYH
8 FROM (SELECT zwrq, Pay_Serial_Nbr, KHBH, STATE, PAY_AMOUNT, YHWDH, YHGYH
9 FROM bank_serial C
10 WHERE c.Bank_Serial = '04' AND c.zwrq = '2007-06-04'
11 AND c.PAY_SERIAL_NBR_OLD IS NULL AND c.pay_amount <> 0
12 AND NOT EXISTS
13 (SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
14 WHERE D.Bank_Serial = '04'
15 AND TRUNC(D.chk_date) =
16 /*to_date('2007-06-04', 'YYYY-MM-DD') 将这个值改为与C表关联*/
17 to_date(c.zwrq, 'YYYY-MM-DD')
18 AND TRIM(D.Pay_Serial_Nbr) = TRIM(C.Pay_Serial_Nbr))) A,
19 bank_serial_detail B
20 WHERE A.Pay_Serial_Nbr = B.Pay_Serial_Nbr and a.zwrq = b.jzrq
21 and A.zwrq = '2007-06-04' and b.Bank_Serial = '04';
1 row inserted
SQL> --只有一条了,正常
SQL> rollback;
Rollback complete
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bi
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.2.0 - Productio
NLSRTL Version 10.2.0.2.0 - Production
SQL> --注意:这SELECT语句是某个过程中的一句,'2007-06-04'和'01'是在变量vDate和iYhdm
SQL>
下面是过程中的原始语句
insert into BANK_CHECK_RESULT(bank_serial,Pay_Serial_Nbr,dfid,fybdid,power_fee,late_fee,TYPE,
state,sm,chk_date,khbh,clbz,yhwdh,yhgyh)
select iYHDM, TRIM(A.pay_serial_nbr) Pay_Serial_Nbr,B.DFID, B.FYBDID, DECODE(A.state,1,
A.PAY_AMOUNT,B.POWER_FEE) JE,B.LATE_FEE wyj,
DECODE(A.State,0,DEcode(nvl(B.FYBDID,'1'),'1','2','0'),A.state) TYPE,
'0' AS STATE, '电力已记账银行未记账' AS SM,
to_date(vDate,'YYYY-MM-DD') AS CHK_DATE,A.khbh,'未处理',A.YHWDH,A.YHGYH
FROM
(SELECT zwrq,Pay_Serial_Nbr,KHBH,STATE,PAY_AMOUNT,YHWDH,YHGYH FROM bank_serial C
WHERE c.Bank_Serial=iYHDM
AND c.zwrq=vDate
AND c.PAY_SERIAL_NBR_OLD IS NULL
AND c.pay_amount <> 0
AND NOT EXISTS
(SELECT 1 FROM bank_CHECK_SERIAL_DETAIL D
WHERE D.Bank_Serial=iYHDM AND TRUNC(D.chk_date)=to_date(vDate,'YYYY-MM-DD')
AND TRIM(D.Pay_Serial_Nbr)=TRIM(C.Pay_Serial_Nbr) )
)A,
bank_serial_detail B
WHERE A.Pay_Serial_Nbr=B.Pay_Serial_Nbr and a.zwrq = b.jzrq
and A.zwrq=vDate and b.Bank_Serial=iYHDM;[/php] |
|