在 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的主要内容,如果未能解决你的问题,请参考以下文章