2017-08-31 34 views
1

明白了從字符串中提取數字以下PL/SQL函數:顯示「NULL」,而不是在PL/SQL函數空行

CREATE FUNCTION extract_number (
in_number VARCHAR2) 
RETURN NUMBER IS 
BEGIN 
RETURN regexp_replace(in_number, '[^[:digit:]]', ''); 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
RETURN NULL; 
END; 

需要把空在​​那裏沒有數值被發現(而不是隻是空行)。例如:

得到的表:

create table tab2 (val varchar2(100)); 
insert into tab2 (val) values ('2133jdhfjshd4'); 
insert into tab2 (val) values ('afafaf'); 
insert into tab2 (val) values ('skdjfj6787887hhh'); 
insert into tab2 (val) values ('324824898'); 
insert into tab2 (val) values ('4jh4jhh4'); 
commit; 

這是從功能的輸出:

  21334 

     6787887 
     324824898 
      444 

在第二行我需要 'NULL' 放置。

NO_DATA_FOUND無法正常工作。請告訴我該怎麼辦?

+0

警告:不要亂用數據類型!如果返回值爲NULL,那麼爲什麼要用四個字母的字符串替換?正如您已經看到的那樣,使用其中一種建議的解決方案,您必須將返回的數據類型 - 從編號更改爲varchar2。據推測,像這樣的函數將被用來從字符串中提取數字,以用於進一步的計算 - **作爲數字**。改變函數返回varchar2,而其他很多事情都會中斷。如果您需要在報告中顯示「NULL」,請在報告圖層中執行,而不是在功能本身中執行。 – mathguy

回答

1

裹在NVL的REGEXP_REPLACE():

NVL(regexp_replace(in_number, '[^[:digit:]]', ''), 'NULL'); 

如果NULL被REGEXP_REPLACE()返回,返回字符串 'NULL'。

Documentation

+1

已將RETURN NUMBER替換爲RETURN VARCHAR2 –

0

在sqlplus你可以使用這個set null 'null'。這僅用於演示。

我發現你的函數有一些問題。

  1. regexp_replace不會拋出NO_DATA_FOUND異常
  2. REGEXP_REPLACE的結果總是VARCHAR2或null Oracle已經做隱式轉換爲數字。
0

不需要NO_DATA_FOUND。然而,你仍然可以提高它..

CREATE FUNCTION extract_number (in_number VARCHAR2) 
     RETURN NUMBER 
    IS 
     v_return NUMBER (10); 
    BEGIN 
     v_return := REGEXP_REPLACE (in_number, '[^[:digit:]]', ''); 

     IF v_return IS NULL 
     THEN 
      RAISE NO_DATA_FOUND; 
     END IF; 

     RETURN v_return; 
    EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
      RETURN NULL; 
    END;