Допустим, у нас есть такая таблица:
CREATE TABLE test_table
(
text VARCHAR2(200) NOT NULL,
text2 VARCHAR2(200) NOT NULL,
ts TIMESTAMP
);
И мы хотим вставить некоторые данные, используя INSERT ALL
:
INSERT ALL
INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' )
SELECT * FROM dual;
Результат
1 row inserted.
Но, когда мы хотим добавить триггер, чтобы заполнить столбец ts
SYSTIMESTAMP
CREATE OR REPLACE TRIGGER test_trigger
BEFORE INSERT ON test_table
FOR EACH ROW
BEGIN
DBMS_OUTPUT.put_line('text=' || :new.text);
DBMS_OUTPUT.put_line('text2=' || :new.text2);
DBMS_OUTPUT.put_line('ts=' || :new.ts);
:new.ts := SYSTIMESTAMP;
END;
/
Запуск того же скрипта
SET SERVEROUT ON;
INSERT ALL
INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' )
SELECT * FROM dual;
Результат:
text=test
text2=
ts=
INSERT ALL
INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' )
SELECT * FROM dual
Error report -
ORA-01400: cannot insert NULL into ("TEST"."TEST_TABLE"."TEXT2")
Использование INSERT
отлично работает
SET SERVEROUT ON;
INSERT INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' )
Результат
text=test
text2=test2
ts=
1 row inserted.
Также это работает:
INSERT ALL
INTO test_table ( text, text2, ts) VALUES ( 'test', 'test2', null )
SELECT * FROM dual
Когда я изменяю тип столбца ts
на DATE
, этот триггер работает нормально.
Я использую Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
, я также проверил на Oracle 12c
, но ошибки нет, так что, может быть, это какая-то ошибка в версии 11g?