2016-11-27 78 views
1

我想檢查一個輸入的電子郵件地址是否有效。我已經創建了以下功能。該功能已成功創建,但是當我嘗試運行該功能時,我無法獲得所需的輸出。我在這個PLSQL函數中做了什麼錯誤?

CREATE OR REPLACE FUNCTION email_validate(p_email IN varchar2) 
    return BOOLEAN 
    is 
    emailregexp constant varchar2(1000):= '^[a-z0-9._-][email protected][a-z0-9.-]+\.[a-z]{1,10}$'; 

    BEGIN 
    IF regexp_like(p_email,emailregexp ,'i') THEN 
    RETURN true; 
    ELSE 
    RETURN false; 
    END IF; 
    END; 

我想檢查輸出的方式是:

DECLARE 

result BOOLEAN; 

BEGIN 

result:= email_validate('[email protected]'); 
dbms_output.put_line(result); 

END; 
+0

對PLSQL正則表達式不太確定,但是您應該可以跳過組中的最後一個'-'字符 – devio

+0

該函數已成功創建,但我無法調用函數,例如我想運行該函數並查看True或假。 「 – indexOutOfBounds

+2

」dbms_output.put_line不會重載以接受布爾參數。「 http://stackoverflow.com/a/13560073/21336 – devio

回答

3

你不能傳遞一個布爾值作爲參數傳遞給dbms_output.put_line。當我運行你的代碼,我得到這個錯誤:

ORA-06550: PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'

務實的解決辦法是讓你的函數返回一個smallint(0或1),這將很好的工作來執行你的電子郵件地址驗證。

然後,您可以測試你的代碼也更容易,就像這樣:

select email_validate('[email protected]') from dual; 

然後,如果您想要顯示的結果爲是「假」或「真」:

select case when email_validate('[email protected]') > 0 
      then 'true' 
      else 'false' 
     end 
from dual; 

如果你留在PL/SQL中,你可以用boolean類型來做到這一點(然後跳過> 0)。但是Oracle SQL無法處理它。

+0

是的,我可以通過輸出1或0這樣做。我問這個問題的原因是,我們是否可以通過輸出True或False來完成? – indexOutOfBounds

+0

@indexOutOfBounds如果您打算始終使用pl/sql「不在select語句中」,它將起作用。要使用dbms_output對其進行測試,只需執行:DBMS_OUTPUT.PUT_LINE(CASE WHEN result then'TRUE'ELSE'FALSE'END)。 – Ftaveras

+0

我剛試過它,它通過這種方法工作。謝謝 :) – indexOutOfBounds

相關問題