oracle 函数(function) NANVL的扩展,语法笔记

先吐槽一波,现在开发一个使用中的后台,其中有多个金额字段的类型是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;

PS:最后的笔记其实是从官网复制过来,翻译了一小下,百度到的什么博客啊,写的很乱,完全不如官网的清楚,以后写东西还是多看官方文档吧.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值