代码之家  ›  专栏  ›  技术社区  ›  Jay S

Oracle存储过程的“Boolean”参数

  •  12
  • Jay S  · 技术社区  · 14 年前

    我知道Oracle没有用于参数的boolean类型,并且当前正在接受一个数字类型,该类型的True/False为1/0(而不是“Y/”N“CHAR(1)方法)。

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

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

    2 回复  |  直到 14 年前
        1
  •  30
  •   Tony Andrews    14 年前

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

    procedure p (p_bool in boolean) is...
    

    但是,不能在SQL中使用布尔值,例如select语句:

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

    对于一个数字参数,没有办法声明性地向它添加一个“check约束”,您需要编写一些验证代码,例如。

    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;
       ...
    
        2
  •  3
  •   Gary Myers    14 年前

    是和不是。 你可以。。

    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;