2010-11-02 24 views
8

Oracle'ın parametreler için kullanılacak bir boole türü olmadığını ve şu anda True/False için 1/0 olacak bir NUMBER türünü aldığımı biliyorum. 'Y'/'N' CHAR (1) yaklaşımı)."Boolean" parametresi

Ben çok gelişmiş Oracle programcı değilim, ama sizin gibi sütun için bir format kullanarak alan kısıtlayabilirsiniz gibi bazı araştırma yaptım ve bazı ASKTOM mesajları okuduktan sonra, öyle görünüyor:

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

Bir giriş parametresine aynı türden bir kontrol kısıtlamasını saklı bir prosedüre uygulamak için bir yol var mı? Girdiyi aldıktan sonra açıkça kontrol etmek yerine olası girişleri 0 veya 1 ile sınırlamak isterim.

cevap

25

Sen can saklı prosedürlere parametre olarak kullanım Boolean:

procedure p (p_bool in boolean) is... 

sen kullanamazsınız Ancak SQL Booleans, mesela select ifadeleri: Bir numara parametresi için

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

bildirimli buna bir "check kısıtlamayı" eklemek için bir yolu yoktur, sen mesela bazı doğrulama kodu gerekir

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

Merhaba Tony olsun 'boolean' türünde yapılmış cehalet affet kalmamasıdır. Gördüğüm yorumları yanlış okumalıyım. Oracle'ın desteklemediğini düşünmüştüm, ama belki de sadece tarla türleri içindi. Yalnızca iki kez denetlemek için, aşağıdakiler bu türle çalışır, değil mi? IF (p_bool) THEN v_MyDisplayString = 'Başarılı oldum!'; END IF; –

+1

Evet, bu PL/SQL çalışacaktır. Veritabanındaki sütunların veri türleri için Boolean desteklenmez ve SQL sorgularında hiç kullanılamaz. –

2

Evet ve hayır. Sen

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; 
/

İyi haber şu ki bir hata bildirir Eğer

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

yaparsak, yani .. yapabilirsiniz.

Kötü haber

select t_bool.f_test(5) from dual; 

yaparsanız o zaman, bir hata