«Логический» параметр для хранимой процедуры Oracle - PullRequest
12 голосов
/ 02 ноября 2010

Мне известно, что у Oracle нет логического типа для использования в качестве параметров, и в настоящее время я принимаю тип NUMBER, который будет иметь значение 1/0 для True / False (вместо 'Y' / 'N' CHAR(1) подход..

Я не очень продвинутый программист Oracle, но после некоторого копания и чтения некоторых постов ASKTOM кажется, что вы можете ограничить поле, используя формат для столбца, например:

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

Есть ли способ применить такой же тип проверочного ограничения к входному параметру хранимой процедуры?Я хотел бы ограничить возможные входные данные 0 или 1, а не проверять их явно после получения входных данных.

Ответы [ 2 ]

30 голосов
/ 02 ноября 2010

Вы можете использовать логические значения в качестве параметров хранимых процедур:

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;
   ...
3 голосов
/ 03 ноября 2010

Да и нет. Вы можете сделать ..

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;

тогда вы не получите ошибку

...