INSERT ALL завершается ошибкой с отметкой времени установки триггера - PullRequest
2 голосов
/ 21 марта 2019

Допустим, у нас есть такая таблица:

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?

1 Ответ

3 голосов
/ 22 марта 2019

В вашем коде нет ничего плохого, это может быть ошибка в используемой вами версии. Тем не менее, то, что вы пытаетесь достичь, чаще всего делается с помощью инструкции create table

CREATE TABLE test_table (
    text   VARCHAR2(200) NOT NULL,
    text2   VARCHAR2(200) NOT NULL,
    ts    TIMESTAMP not null default systimestamp
);

Вам вообще не понадобится триггер для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...