Oracle 存储过程的“布尔”参数

Posted

技术标签:

【中文标题】Oracle 存储过程的“布尔”参数【英文标题】:"Boolean" parameter for Oracle stored procedure 【发布时间】:2011-05-04 00:58:04 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

嗨托尼,请原谅我对“布尔”类型的无知。我一定误读了我看到的关于它的cmets。我原以为 Oracle 不支持它,但也许那只是针对字段类型。只是为了仔细检查,以下内容适用于该类型,对吗? IF (p_bool) THEN v_MyDisplayString = '我成功了!';如果结束; 是的,PL/SQL 可以工作。数据库中列的数据类型不支持布尔值,并且根本不能在 SQL 查询中使用。【参考方案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;

那么你不会收到错误

【讨论】:

以上是关于Oracle 存储过程的“布尔”参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将布尔数据类型作为存储过程的参数传递?

使用 Mybatis 将布尔参数传递给存储过程

oracle存储过程输入参数能否为空

ORACLE存储过程怎么调用?

PostgreSQL Oracle 兼容性之存储过程

oracle存储过程,IN OUT 类型的参数怎么传参数