Как узнать в триггере, передано ли значение NULL в обнуляемый столбец? - PullRequest
1 голос
/ 18 мая 2011

Как можно выяснить в триггере BEFORE INSERT, прошел ли пользователь значение NULL для пустого столбца явный , или пользователь вообще не передал никакого значения для этот столбец.

Другими словами, я смогу сделать следующее:

create table t (id, NUMBER, str VARCHAR2(30) );

create Trigger trg 
befor INSERT on t
FOR earch row
DECLARE
BEGIN
IF :NEW.str is NULL
THEN
  IF <NULL-Value was explicit passed> THEN
    dbms_output.put_line( 'user has passed NULL');
  ELSE 
    dbms_output.put_line( 'user has passed nothing');
  END IF;
END IF;
END;
/

и затем после

INSERT INTO t (id, str) VALUES (1, NULL);

Я увижу

> user has passed NULL

и после

INSERT INTO t (id) VALUES (1);

Я увижу

> user has passed nothing

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

В Oracle нет способа программно отличить NULL, преднамеренно переданный от значения по умолчанию NULL.

Помимо всего прочего, это приписывает значение NULL, когда NULL вызывающе остается отсутствием значения.Зачем вам это нужно?


@ OneDayWhen sez:

"Сам Кодд предложил второй тип NULL для обозначения" неприменимый ""

Да, «Эта страница намеренно оставлена ​​пустой» для баз данных.Очевидно, к концу своей жизни Кодд определил четыре различных типа NULL.8-)

Другие разновидности СУБД различают пустую строку и NULL, и, возможно, в некоторых местах есть соглашение, что пустая строка означает «неприменимый», а NULL ничего не значит.Тем не менее, Oracle обрабатывает пустую строку как NULL, и никто не реализовал кодл NULL2.Поэтому я считаю, что приписывать значение NULL в Oracle опасно.

Есть некоторые теоретики баз данных, которые считают, что NULL была одной из больших ошибок Кодда, и это удваивается для разных типов NULL.Для интересного альтернативного взгляда на тему попробуйте прочитать Криса Дейта «Как обрабатывать недостающую информацию без использования NULL

».
2 голосов
/ 18 мая 2011

Почему вы хотите использовать для этого триггер, а не значение по умолчанию в столбце таблицы? Исходя из ваших комментариев к ответу APC, вы не пытаетесь этого достичь?

create table t(id number, str varchar2(32) default 'default value');
create view v as select * from t;

insert into t(id) values (1);
insert into t(id, str) values (2,null);

insert into v(id) values (3);
insert into v(id, str) values (4,null);

select * from t;

ID                     STR                              
---------------------- -------------------------------- 
1                      default value                    
2                                                       
3                      default value                    
4                   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...