Sql 使用触发器设置时间戳插入所有失败
假设我们有一张这样的桌子:Sql 使用触发器设置时间戳插入所有失败,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,假设我们有一张这样的桌子: CREATE TABLE test_table ( text VARCHAR2(200) NOT NULL, text2 VARCHAR2(200) NOT NULL, ts TIMESTAMP ); 我们想使用全部插入插入一些数据: INSERT ALL INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' ) SELECT * FROM dual;
CREATE TABLE test_table
(
text VARCHAR2(200) NOT NULL,
text2 VARCHAR2(200) NOT NULL,
ts TIMESTAMP
);
我们想使用全部插入插入一些数据:
INSERT ALL
INTO test_table ( text, text2 ) VALUES ( 'test', 'test2' )
SELECT * FROM dual;
结果是
1 row inserted.
text=test
text2=test2
ts=
1 row inserted.
但是,当我们想要添加触发器时,用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' )
结果是
1 row inserted.
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 11.2.0.2.0-64位产品版,我也检查了Oracle 12c,但没有错误,所以可能是11g版本中的某种错误?您的代码似乎没有问题,可能是您使用的版本存在错误。
也就是说,您试图实现的目标通常是通过以下CREATETABLE语句完成的
CREATE TABLE test_table (
text VARCHAR2(200) NOT NULL,
text2 VARCHAR2(200) NOT NULL,
ts TIMESTAMP not null default systimestamp
);
您根本不需要触发器。非常奇怪。我也能复制它。定期插入工作。