Oracle NVL和DECODE函数的漏洞

  在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 on
2 SQL> select decode(‘10‘,‘10‘,‘is same‘,f_print_str) from dual;
3
4 DECODE(‘10‘,‘10‘,‘ISSAME‘,F_PR
5 ----------------------------------------
6 is same
7
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          1
10
11 SQL> select decode(‘10‘,‘10‘,‘is same‘,seq_test.nextval) from dual; --此处sequence条件不成立,但是也被执行
12
13 DECODE(‘10‘,‘10‘,‘ISSAME‘,SEQ_
14 ----------------------------------------
15 is same
16
17 SQL> select seq_test.currval from dual;
18
19    CURRVAL
20 ----------
21          2
22
23 SQL> 

为了解决上面的问题,可以创建一个函数用于返回sequence.nextval的值,如果条件不成立,sequence的值不会变动。

1 --创建一个函数,用于返回sequence.nextval的值
2 CREATE OR REPLACE FUNCTION F_GET_SEQ RETURN NUMBER AS
3   V_SEQ_NUM NUMBER;
4 BEGIN
5   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_GE
11 ----------------------------------------
12 is same
13
14 SQL> select seq_test.currval from dual;
15
16    CURRVAL
17 ----------
18          3
19
20 SQL> 
时间: 2024-08-11 03:07:54

Oracle NVL和DECODE函数的漏洞的相关文章

Oracle中的decode()函数

一.decode()函数 1.语法 DECODE(control_value,value1,result1[,value2,result2-][,default_result]); control _value :试图处理的数值.DECODE函数将该数值与后面的一系列的偶序相比较,以决定返回值. value1:是一组成序偶的数值.如果输入数值与之匹配成功,则相应的结果将被返回.对应一个空的返回值,可以使用关键字NULL于之对应. result1:是一组成序偶的结果值. default_resul

oracle数据库中decode函数的使用

语法 decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 函数含义 IF条件=值1THEN RETURN(返回值1) ELSIF条件=值2THEN RETURN(返回值2) ...... ELSIF条件=值nTHEN RETURN(返回值n) ELSE RETURN(缺省值) ENDIF 注意,后面的缺省值是可以不写的. select lb.contno, decode(cont.conttype, '1', cont.appntno, '2', cont.ins

Oracle nvl、nvl2、nullif、decode、case函数详解

1.NVL函数 nvl(expr1,expr2),如果expr1为空,则返回expr2: 2.NVL2函数 nvl2(expr1,expr2,expr3),如果expr1为空,则返回expr3,否则返回expr2: 3.NULLIF函数 nullif(expr1,expr2),如果expr1=expr2,返回空,否则返回expr1,要求两个表达式数据类型一致: SQL> insert into t1 values(9); 说明1:NVL和NVL2函数在进行空值判断的时候,都会将函数内的表达式执行

oracle 中的decode,sign,和nvl

1.decode 常见的用法 : decode(condition , value1,result1[, value2, result2],default_result) decode其实相当于一个if 条件 函数 condition 相当于一个输入的值 ,而value i则是参数列表,若输入的值为value1,则对应的返回结果为result1. 如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值default_result. decode不同于其他SQL函数,decode函数可以识别和

Oracle 中 decode 函数用法

Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ......ELSIF 条件=值n THEN RETURN(翻译值n)ELSE RETURN(缺省值)END IFdecode(字段或字段的运算,值1,值2,值3) 这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值

oracle中的聚合函数count、max、min、sum、avg以及NVL函数的用法

oracle中的聚合函数count.max.min.sum.avg以及NVL函数的用法 分组函数聚合函数对一组行中的某个列执行计算执行计算并返回单一的值.聚合函数忽略空值.聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用,所以有的时候也把其称之为分组函数.这类函数通常应用于报表统计中,以下展示Oracle常用的聚合函数的应用. 分组函数的介绍 作用于一组数据,并对一组数据返回一个值. 常见的分组函数有: Count 用来计算有效数据的数量 Min 返回一个数字列或计算列的最小

Oracle DECODE函数的用法详解

Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0.正数还是负数,分别返回0.1.-1例如:变量1=10,变量2=20则sign(变量1-变量2)返回-1,decode解码结果为"变量1",达到了取较小值的目的.2.此函数用在SQL语句中,功能介绍如下:Decode函数与一系列嵌套的 IF-THEN-ELSE语句相似.base_exp与co

oracle decode函数使用方法

DECODE函数是ORACLE PL/SQL是功能强大的函数之一,目前还只有ORACLE公司的SQL提供了此函数,其他数据库厂商的SQL实现还没有此功能.DECODE有什么用途 呢? 先构造一个例子,假设我们想给智星职员加工资,其标准是:工资在8000元以下的将加20%:工资在8000元以上的加15%,通常的做法是,先选出记录 中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else或cho

oracle decode函数用法

DECODE函数是ORACLE PL/SQL是功能强大的函数之中的一个,眼下还仅仅有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能.DECODE有什么用途 呢? 先构造一个样例,如果我们想给智星职员加工资,其标准是:工资在8000元下面的将加20%:工资在8000元以上的加15%.通常的做法是.先选出记录 中的工资字段值? select salary into var-salary from employee,然后对变量var-salary用if-then-else