[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
- 20201215]記錄工作中的錯誤.txt
- [20181219]記錄自己工作中的錯誤.txt
- [20190225]ORA-07217錯誤.txt
- [20190415]ora-02049錯誤.txt
- [20180302]使用find命令小錯誤.txt
- 手勢識別中一些錯誤解決方法
- [20181031]模擬ora-01591錯誤.txt
- [20181122]模擬ORA-08103錯誤.txt
- [20180428]DNS與ORA-12154錯誤.txtDNS
- [20180713]關於hash join 測試中一個疑問.txt
- [20181106]模擬ora-00600[4194]錯誤.txt
- [20181204]模擬ora-00600[4194]錯誤.txt
- [20181204]模擬ora-00600[4193]錯誤.txt
- [20190918]shrink space與ORA-08102錯誤.txt
- [20190427]表改名與ora-14047錯誤.txt
- 2024.11.1 一個錯誤
- [20231101]記錄自己工作中1次失誤.txt
- Python程式設計中一些常見的錯誤和處理方法Python程式設計
- MySQL 中一個雙引號的錯位引發的血案MySql
- 做個前端錯誤監控前端
- 第一個錯誤的版本
- [20190104]sga_target 的設定和ORA-04031錯誤.txt
- 5個需要避免的CSS錯誤CSS
- 【常見錯誤】--Nltk使用錯誤
- iis7.5錯誤 配置錯誤
- leedcode-第一個錯誤的版本
- macOS小白容易犯的24個錯誤Mac
- DG使用中遇到的幾個錯誤
- 放棄JavaFX是一個錯誤? - RedditJava
- 分享一個有意思的錯誤
- 事故現場:MySQL 中一個雙引號的錯位引發的血案MySql
- System.AggregateException: 發生一個或多個錯誤.....Exception
- -206 錯誤. 在表中找不到對應的資料欄位txt
- nginx 錯誤除錯Nginx除錯
- PbootCMS錯誤提示:執行SQL發生錯誤!錯誤:no such column: def1bootSQL
- go新手容易犯的三個致命錯誤Go