2010-11-02 161 views
8

我知道Oracle沒有用於參數的布爾類型,並且當前正在採用NUMBER類型,該類型對於True/False具有1/0(而不是'Y'/'N'CHAR(1)方法)。用於Oracle存儲過程的「布爾」參數

我不是一個很先進的Oracle程序員,但做一些挖掘和閱讀一些ASKTOM的帖子後,就好像你可以使用格式,如列限制字段:

MyBool NUMBER(1) CHECK (MyBool IN (0,1))

有沒有辦法將相同類型的檢查約束應用於存儲過程的輸入參數?我想限制可能的輸入爲0或1,而不是在收到輸入後明確檢查它。

回答

25

可以使用布爾值作爲存儲過程的參數:

procedure p (p_bool in boolean) is... 

但是你不能用布爾值在SQL,例如select語句:

select my_function(TRUE) from dual; -- NOT allowed 

對於一些參數沒有聲明的方式來添加一個「檢查約束」來了,你就必須例如一些代碼驗證

procedure p (p_num in number) is 
begin 
    if p_num not in (0,1) then 
     raise_application_error(-20001,'p_num out of range'); 
    end if; 
    ... 
+0

託尼嗨,原諒我的「布爾」類型的無知。我一定誤解了我所看到的評論。我曾以爲甲骨文不支持它,但也許這隻適用於字段類型。 只是爲了仔細檢查,以下是否適用於該類型,是否正確? IF(p_bool)THEN v_MyDisplayString ='我成功了!'; END IF; – 2010-11-04 12:38:23

+1

是的,PL/SQL將起作用。數據庫中的列的數據類型不支持布爾值,並且在SQL查詢中根本不能使用布爾值。 – 2010-11-04 12:40:28

2

是的,沒有。 你可以做..

create or replace package t_bool is 
    subtype t_bool_num IS PLS_INTEGER RANGE 0..1; 
    function f_test (i_bool_num t_bool_num) return varchar2; 
end t_bool; 
/

create or replace package body t_bool is 
    function f_test (i_bool_num t_bool_num) return varchar2 is 
    begin 
    if i_bool_num = 0 then 
     return 'false'; 
    elsif i_bool_num = 1 then 
     return 'true'; 
    elsif i_bool_num is null then 
     return 'null'; 
    else 
     return to_char(i_bool_num); 
    end if; 
    end; 
end t_bool; 
/

的好消息是,如果你做

exec dbms_output.put_line(t_bool.f_test(5)); 

它報告錯誤。

壞消息是,如果你做

select t_bool.f_test(5) from dual; 

,那麼你沒有得到一個錯誤