在 Oracle 中插入后触发插入 sysdate

Posted

技术标签:

【中文标题】在 Oracle 中插入后触发插入 sysdate【英文标题】:Trigger to insert sysdate after an insert in Oracle 【发布时间】:2011-05-13 23:47:27 【问题描述】:

我尝试使用以下内容,但显然它是无效的 SQL:

CREATE OR REPLACE TRIGGER QUESTION_DATE BEFORE INSERT ON QUESTION 
FOR EACH ROW
BEGIN
INSERT INTO QUESTION(CREATED_TIMESTAMP) 
VALUES (SYSDATE);
END;

到目前为止,问题表如下所示:

CREATE TABLE QUESTION
(   
    QUESTION_ID             INTEGER not null,
    LATEST_QUESTION         INTEGER not null,
    CREATED_USER_ID         INTEGER not null,
    CREATED_TIMESTAMP       TIMESTAMP not null,     
    CONSTRAINT PK_QUESTION  PRIMARY KEY (QUESTION_ID)
);

CREATE SEQUENCE QUESTION_ID_SEQ INCREMENT BY 1 START WITH 1 NOCYCLE NOCACHE NOORDER;

CREATE TRIGGER QUESTION_INSERT BEFORE INSERT ON QUESTION 
FOR EACH ROW
BEGIN
SELECT QUESTION_ID_SEQ.nextval
INTO :new.QUESTION_ID
FROM dual;
END;

如果相关,我正在使用 Toad for Oracle V9.0.1.8

【问题讨论】:

提供更多信息。您尝试设置为 sysdate 的列是否与您刚刚插入的行是同一个表?例如,如果您的表有 ColumnFirst 和 ColumnTheDate,您是否尝试将 ColumnTheDate 设置为等于您刚刚插入的行的 sysdate? 是的,我正在尝试将我刚刚插入的行的 ColumnTheDate 设置为 Sysdate 【参考方案1】:

:new.created_timestamp := sysdate

而不是插入。

插入已经发生,无需再次执行。

您也可以将 sysdate 设为该列的默认值,但这将允许在插入语句中覆盖该值。

【讨论】:

【参考方案2】:

我想你可能想要这个:

CREATE OR REPLACE TRIGGER QUESTION_DATE BEFORE INSERT ON QUESTION 
FOR EACH ROW
BEGIN
 :NEW.CREATED_TIMESTAMP := SYSDATE;
END;

您的触发器尝试在 QUESTION 中插入另一行,这将触发触发器并...

【讨论】:

我在尝试添加触发器时仍然收到“ORA-00900:无效的 SQL 语句” 你的触发器和我的一模一样吗? 是的,我复制并粘贴了声明 糟糕,没关系!我忘了作为脚本执行,而是在编辑器中运行它。感谢您的帮助!【参考方案3】:

不要使用触发器在 Oracle 中设置默认值。相反,在列上使用“DEFAULT”。 这是一个示例列

CREATED_TIMESTAMP  TIMESTAMP  DEFAULT SYSDATE  NOT NULL,

【讨论】:

我同意。请注意,如果它是现有表,则在 Oracle 填充新列时整个表将被锁定。 请记住,这不会更新时间戳 这仅适用于简单的默认值。如果需要调用 PL/SQL 函数来生成默认值(例如 DBMS_RANDOM 来生成随机字符序列),则不能使用 DEFAULT

以上是关于在 Oracle 中插入后触发插入 sysdate的主要内容,如果未能解决你的问题,请参考以下文章

插入或删除后的 Oracle 触发器

ORACLE触发器中如何终止SQL语句

如何在 Oracle 中插入带小数秒的日期和时间?

oracle学习

在oracle中插入表B后创建触发器以将新行添加到表A中时出错

oracle添加默认值列后续插入的才应用默认值