Oracle存储过程的“Boolean”参数

时间:2010-11-02 16:12:15

标签: oracle parameters boolean

我知道Oracle没有用于参数的布尔类型,并且我目前正在使用NUMBER类型,其中True / False为1/0(而不是'Y'/'N'CHAR (1)方法)。

我不是一个非常高级的Oracle程序员,但在做了一些挖掘和阅读一些ASKTOM帖子后,似乎你可以使用列的格式来限制字段,如:

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

有没有办法将相同类型的检查约束应用于存储过程的输入参数?我想将可能的输入限制为0或1,而不是在收到输入后明确检查它。

2 个答案:

答案 0 :(得分:30)

可以使用布尔值作为存储过程的参数:

procedure p (p_bool in boolean) is...

但是你不能在SQL中使用布尔值,例如选择陈述:

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

答案 1 :(得分:3)

是和否。 你可以做..

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;

然后你没有收到错误