1. 程式人生 > >plsql oracle 函式regexp_replace字元的處理案例

plsql oracle 函式regexp_replace字元的處理案例

先吐槽一波,現在開發一個使用中的後臺,其中有多個金額欄位的型別是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;