[20180904]工作中一個錯誤.txt
[20180904]工作中一個錯誤.txt
--//昨天看我提交一份修改建議,發現自己寫的sql語句存在錯誤.
--//連結:http://blog.itpub.net/267265/viewspace-2213259/
--//裡面提到:
5f2atm993xz6w
update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1
修改為
update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 and PDBZ <> :"SYS_B_0" and STATUS <>:"SYS_B_1"
--//這樣修改是有問題,透過一個例子說明:
1.環境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
SCOTT@test01p> create table t (id number,a number,b number);
Table created.
insert into t values (1,0,0);
insert into t values (1,0,1);
insert into t values (1,1,0);
insert into t values (1,1,1);
insert into t values (1,2,2);
insert into t values (1,2,1);
commit;
2.測試:
SCOTT@test01p> select * from t where id=1 and a<>1 and b<>1;
ID A B
---------- ---------- ----------
1 0 0
1 2 2
--//可以發現這樣寫僅僅顯示兩條.如果按照前面的語句執行dml,就存在錯誤了.
update PD_PMXS SET PDBZ =1 , STATUS =1 WHERE RDID =:1
--//修改為
update PD_PMXS SET PDBZ =1 , STATUS =1 WHERE RDID =:1 and PDBZ <>1 and STATUS <>1
--//這樣僅僅(PDBZ, STATUS) =(0,0),(2,2) 才會修改.其它情況不會修改,實際上這是一個集合問題.
--//執行如下就對了.
SCOTT@test01p> select * from t where id=1 and (a<>1 or b<>1);
ID A B
---------- ---------- ----------
1 0 0
1 0 1
1 1 0
1 2 2
1 2 1
--//也就是我上面的語句要修改如下:
update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 and (PDBZ <> :"SYS_B_0" or STATUS <>:"SYS_B_1" );
--//實際上面的寫法很容易混亂,寫成集合的形式就容易理解也不會錯誤.
SCOTT@test01p> select * from t where id=1 and (a,b) not in (1,1);
select * from t where id=1 and (a,b) not in (1,1)
*
ERROR at line 1:
ORA-00920: invalid relational operator
--//集合還要加一個括號.
SCOTT@test01p> select * from t where id=1 and (a,b) not in ((1,1));
ID A B
---------- ---------- ----------
1 0 0
1 0 1
1 1 0
1 2 2
1 2 1
--//這樣上面的修改如下:
5f2atm993xz6w
update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1
修改為
update PD_PMXS SET PDBZ =:"SYS_B_0" , STATUS =:"SYS_B_1" WHERE RDID =:1 and (PDBZ,STATUS) not in(( :"SYS_B_0" , :"SYS_B_1" );
--//這樣也好理解也不會錯誤,給自己一個工作中提一個醒.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2213567/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於 curl 工作中一個小錯誤
- [20180830]工作中一次失誤.txt
- 啟動資料庫的其中一個錯誤資料庫
- [20181219]記錄自己工作中的錯誤.txt
- 手勢識別中一些錯誤解決方法
- 20201215]記錄工作中的錯誤.txt
- 關於eclipse中一些常見的錯誤01Eclipse
- mysql 一個錯誤MySql
- oerr錯誤查詢工作的使用與ora-56729錯誤的處理
- MySQL 中一個雙引號的錯位引發的血案MySql
- Python程式設計中一些常見的錯誤和處理方法Python程式設計
- 今天早上檢查資料庫的備份日誌,發現其中一個資料庫的expdp錯誤:資料庫
- 做個前端錯誤監控前端
- 第一個錯誤的版本
- 開發者常犯的 9 個錯誤
- 微信支付錯誤兩個問題的解決:curl出錯,錯誤碼:60
- [20121214]資料庫錯誤記錄.txt資料庫
- 這個錯誤,每個ScrumMaster都犯過ScrumAST
- WebApi在MVC 4中一個Controll多個post方法報錯處理WebAPIMVC
- 5個需要避免的CSS錯誤CSS
- 上一個日誌的錯誤
- IT人士常犯的17個職場錯誤
- [20180302]使用find命令小錯誤.txt
- 事故現場:MySQL 中一個雙引號的錯位引發的血案MySql
- eclipse中一個project下多個module?EclipseProject
- 分享一個有意思的錯誤
- python開發者常犯的10個錯誤Python
- 放棄JavaFX是一個錯誤? - RedditJava
- macOS小白容易犯的24個錯誤Mac
- PHP開發者常犯的10個MySQL錯誤PHPMySql
- Java 中最常見的 5 個錯誤Java
- 一個[kclchkblk_4]錯誤處理
- 一個ORA-604錯誤的分析
- 22、listener的幾個錯誤程式碼
- 2024.11.1 一個錯誤
- [20180428]DNS與ORA-12154錯誤.txtDNS
- ORACLE 異常錯誤 錯誤號大全Oracle
- Code Review 常見的5個錯誤模式View模式