標籤:style blog color io ar art div 問題 cti
在Oracle中,即使條件不符合, NVL函數也會執行條件不符合的選項,對於DECODE函數,如果裡面有自訂函數,則decode不會執行不合格函數,但是如果decode裡面有sequence.nextval,不管條件是否符合,sequence都會自增。
1 --建立一個函數,當被調用時列印“the functionss is executed” 2 CREATE OR REPLACE FUNCTION f_print_str 3 RETURN NUMBER 4 AS 5 BEGIN 6 7 DBMS_OUTPUT.PUT_LINE(‘the funcionts is executed‘); 8 RETURN 1; 9 10 END f_print_str;
NVL:
比如下面的例子,即使nvl第一個參數不為空白,返回第一個參數的值-11,但是函數f_print_str還是會被執行,列印"the function is eceucted"
1 SQL> set serveroutput on 2 SQL> select nvl(‘11‘,f_print_str) from dual; 3 4 NVL(‘11‘,F_PRINT_STR) 5 ---------------------------------------- 6 11 7 8 the funcionts is executed 9 10 SQL>
DECODE:
decode函數不會執行不合格選項,下面的例子沒有列印“the functions is exeucted”
1 SQL> set serveroutput on2 SQL> select decode(‘10‘,‘10‘,‘is same‘,f_print_str) from dual;3 4 DECODE(‘10‘,‘10‘,‘ISSAME‘,F_PR5 ----------------------------------------6 is same7 8 SQL>
如果decode函數裡麵包含sequence.nextval,則不管條件是否符合,sequence值都會變化。
1 SQL> CREATE SEQUENCE SEQ_TEST MINVALUE 1 MAXVALUE 200 START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE; 2 3 Sequence created 4 5 SQL> select seq_test.nextval from dual; 6 7 NEXTVAL 8 ---------- 9 110 11 SQL> select decode(‘10‘,‘10‘,‘is same‘,seq_test.nextval) from dual; --此處sequence條件不成立,但是也被執行12 13 DECODE(‘10‘,‘10‘,‘ISSAME‘,SEQ_14 ----------------------------------------15 is same16 17 SQL> select seq_test.currval from dual;18 19 CURRVAL20 ----------21 222 23 SQL>
為瞭解決上面的問題,可以建立一個函數用於返回sequence.nextval的值,如果條件不成立,sequence的值不會變動。
1 --建立一個函數,用於返回sequence.nextval的值2 CREATE OR REPLACE FUNCTION F_GET_SEQ RETURN NUMBER AS3 V_SEQ_NUM NUMBER;4 BEGIN5 SELECT SEQ_TEST.NEXTVAL INTO V_SEQ_NUM FROM DUAL;6 DBMS_OUTPUT.PUT_LINE(‘the funcionts is executed‘);7 RETURN V_SEQ_NUM;8 9 END F_GET_SEQ;
比如下面的例子,f_get_seq處條件不成立,函數f_get_seq不會執行,相應的裡面的sequence:seq_test的值也不會有變動
1 SQL> set serveroutput on 2 SQL> select seq_test.currval from dual; 3 4 CURRVAL 5 ---------- 6 3 7 8 SQL> select decode(‘10‘,‘10‘,‘is same‘,f_get_seq) from dual; 9 10 DECODE(‘10‘,‘10‘,‘ISSAME‘,F_GE11 ----------------------------------------12 is same13 14 SQL> select seq_test.currval from dual;15 16 CURRVAL17 ----------18 319 20 SQL>
Oracle NVL和DECODE函數的漏洞