Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用触发器设置时间戳插入所有失败_Sql_Oracle_Oracle11g - Fatal编程技术网

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
);

您根本不需要触发器。

非常奇怪。我也能复制它。定期插入工作。