2010-11-02 29 views
8

Soy consciente de que Oracle no tiene un tipo booleano para usar para los parámetros, y actualmente estoy tomando un tipo NÚMERO que tendría 1/0 para verdadero/falso (en lugar del Enfoque 'Y'/'N' CHAR (1)).parámetro "Boolean" para el procedimiento almacenado de Oracle

no soy un programador muy avanzada de Oracle, pero después de hacer algo de investigación y la lectura de algunos de los puestos ASKTOM, parece que puede restringir un campo utilizando un formato para la columna como:

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

¿Hay alguna manera de aplicar el mismo tipo de restricción de verificación a un parámetro de entrada a un procedimiento almacenado? Me gustaría restringir las posibles entradas a 0 o 1, en lugar de buscarlas explícitamente después de recibir la entrada.

Respuesta

25

Usted puede uso booleanos como parámetros a procedimientos almacenados:

procedure p (p_bool in boolean) is... 

Sin embargo no se puede utilizar Booleanos en SQL, por ejemplo, select:

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

Para un parámetro de número que no hay manera de agregar una forma declarativa "restricción de comprobación" a ella, tendría que codificar una validación por ejemplo,

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

Hola, Tony, perdonen mi ignorancia del tipo 'booleano'. Debo haber leído mal los comentarios que había visto al respecto. Pensé que Oracle no lo soportaba, pero quizás era solo para tipos de campo. Solo para verificarlo dos veces, lo siguiente funciona con ese tipo, ¿correcto? IF (p_bool) ENTONCES v_MyDisplayString = '¡Fui exitoso!'; END IF; –

+1

Sí, ese PL/SQL funcionará. Boolean NO es compatible con los tipos de datos de las columnas en la base de datos y no se puede utilizar en absoluto en las consultas SQL. –

2

Sí y no. Se puede hacer ..

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 buena noticia es que, si lo hace

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

se informa de un error.

La mala noticia es que si lo hace

select t_bool.f_test(5) from dual; 

entonces no se produce un error

Cuestiones relacionadas