【问题标题】:Trigger to insert sysdate after an insert in Oracle在 Oracle 中插入后触发插入 sysdate
【发布时间】: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

标签: sql oracle triggers


【解决方案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
    猜你喜欢
    • 2017-09-15
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多