赞
踩
先吐槽一波,现在开发一个使用中的后台,其中有多个金额字段的类型是varchar2,并且里面有非数字字段,导致我累加的时候会报错.
并且没有很好的办法解决,为什么其他办法不好解决先不谈.我准备写一个oracle函数,来解决问题.
需求很简单,伪代码写下来
- public Number myNanvl(String str, Number defaultValue){
- //如果是数字 返回本身数字
- if(isNum(str){
- return to_number(str);
- }
- //如果不是数字,返回默认值
- return defaultValue;
- }
oracle并没有找到合适的isNum函数,所以用
regexp_replace(str,'^[-\+]?\d+(\.\d+)?$','') IS NOT NULL
替代一下.
最终代码是这样的
- CREATE OR REPLACE
- FUNCTION "myNanvl"(str VARCHAR2, defaultValue NUMBER) RETURN NUMBER
- AS
- BEGIN
- IF regexp_replace(str,'^[-\+]?\d+(\.\d+)?$','') IS NOT NULL THEN
- return defaultValue;
- END IF;
- RETURN "TO_NUMBER"(str);
- END;
测试结果
- select "myNanvl"('12.12.12', 0) from dual
- --返回0
- select "myNanvl"('NaN', 0) from dual
- --返回0
- select "myNanvl"('NaN', 100) from dual
- --返回100
- select "myNanvl"('123', 0) from dual
- --返回123
关于regexp_replace();
其实if后面的条件是可以抽象一下的,懒得搞了,目前必要性也不大.
完了确实没很好的方法判断字符是不是数字的,就这个正则还是灰常准确的,所以就用他咯
下面就开始笔记了哈,
创建函数的语法
[]内为可选语法
| 为多选一
- 创建自定义函数的语法
- CREATE [OR REPLACE]
- FUNCTION "函数名"[(形参组)] RETURN 返回值类型
- AS|IS
- BEGIN
- -- 函数体
- RETURN NULL;
- END;
-
- --其中形参组的语法是 形参名 IN|OUT|空 类型
- CREATE FUNCTION myFunction(str IN VARCHAR2, num OUT NUMBER, c char)
- ...
if语句
condition代表一个条件
–1.语法 (IF-THEN)
Oracle/PLSQL中IF-THEN的语法是:
- IF condition THEN
- {...statements to execute when condition is TRUE...}
- END IF;
–2.Syntax (IF-THEN-ELSE)
Oracle/PLSQL中IF-THEN-ELSE的语法是:
- IF condition THEN
- {...statements to execute when condition is TRUE...}
-
- ELSE
- {...statements to execute when condition is FALSE...}
-
- END IF;
–3语法 (IF-THEN-ELSIF)
敲黑板,这里要考的,是ELSIF
Oracle/PLSQL中IF-THEN-ELSIF的语法是:
- IF condition1 THEN
- {...statements to execute when condition1 is TRUE...}
-
- ELSIF condition2 THEN
- {...statements to execute when condition2 is TRUE...}
-
- ELSE
- {...statements to execute when both condition1 and condition2 are FALSE...}
-
- END IF;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。