2010-11-02 19 views
8

Sono consapevole del fatto che Oracle non ha un tipo booleano da utilizzare per i parametri e sto attualmente utilizzando un tipo NUMBER che avrebbe 1/0 per True/False (anziché il Approccio 'Y'/'N' CHAR (1).Parametro "booleano" per la stored procedure Oracle

Io non sono un programmatore molto avanzata di Oracle, ma dopo aver fatto qualche scavo e leggendo alcuni post ASKTOM, sembra che è possibile limitare un campo utilizzando un formato per la colonna come:

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

Esiste un modo per applicare lo stesso tipo di vincolo di controllo a un parametro di input a una stored procedure? Mi piacerebbe limitare i possibili input a 0 o 1, piuttosto che controllarlo esplicitamente dopo aver ricevuto l'input.

risposta

25

È possibile uso booleani come parametri per stored procedure:

procedure p (p_bool in boolean) is... 

Tuttavia non è possibile utilizzare booleani in SQL, ad esempio, select:

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

Per un parametro numero non c'è modo di aggiungere in modo dichiarativo un "vincolo di controllo" ad esso, si dovrebbe codificare alcuni convalida per esempio

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

Ciao Tony, perdoni la mia ignoranza del tipo 'booleano'. Devo aver frainteso i commenti che avevo visto al riguardo. Pensavo che Oracle non lo supportasse, ma forse era solo per i tipi di campo. Solo per ricontrollare, quanto segue funziona con quel tipo, corretto? IF (p_bool) THEN v_MyDisplayString = 'Avevo successo!'; FINE IF; –

+1

Sì, che PL/SQL funzionerà. Boolean NON è supportato per i tipi di dati delle colonne nel database e non può essere utilizzato affatto nelle query SQL. –

2

Sì e no. Si può fare ..

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

La buona notizia è che, se si fa

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

si segnala un errore.

La cattiva notizia è che se si fa

select t_bool.f_test(5) from dual; 

allora non si ottiene un errore

Problemi correlati