Oracle NVL和DECODE函數的漏洞

來源:互聯網
上載者:User

標籤: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函數的漏洞

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.