插入期间触发器触发

时间:2017-12-29 03:59:11

标签: oracle oracle11g

Hai我创建了两个表,一个源表和另一个目标表。如果雇用日期大于SYSDATE,我创建了一个触发器,用于在目标表中插入雇用日期。但是日期没有插入目标表中。 这是查询。请纠正我的错误。提前谢谢。

CREATE OR REPLACE TRIGGER hir_trg
BEFORE INSERT
ON hir_tb
FOR EACH ROW
BEGIN
INSERT INTO trg_tb VALUES (:NEW.h_date);
END;
/

DECLARE
v_date  DATE;
v_er    EXCEPTION;
BEGIN
v_date := &v_date;
dbms_output.put_line(v_date);
IF v_date > SYSDATE THEN
RAISE v_er;
END IF;
INSERT INTO hir_tb VALUES (103, 'abc', v_date, 25400);
EXCEPTION
    WHEN v_er THEN 
    dbms_output.put_line('Not a Valid Date');
END;
/

2 个答案:

答案 0 :(得分:0)

您首先提出异常,然后运行INSERT。当条件满足时,它永远不会以这种方式执行INSERT。在IF..END IF之前在RAISE内添加另一个插页。

IF v_date > SYSDATE THEN
INSERT INTO hir_tb VALUES (103, 'abc', v_date, 25400);
RAISE v_er;
END IF;
INSERT INTO hir_tb VALUES (103, 'abc', v_date, 25400);

另请注意,您必须始终在INSERT语句中明确提及列名,以避免混淆 - INSERT INTO yourtable(col1,col2,col3) VALUES (value1,value2,value3);

编辑: 你说,

  

如果我使用上面的代码,它将插入源表和目标   表。但我需要它只插入目标表。

将插入添加到异常块中的目标表中,并删除IF..END IF中的插入。不需要TRIGGER

EXCEPTION
    WHEN v_er THEN 
    dbms_output.put_line('Not a Valid Date');
    INSERT INTO trg_tb VALUES (v_date);
END;

答案 1 :(得分:0)

使用&v_date没有问题,您应该使用quotations对其进行格式化并使用nls_date_format(此处,我假设为dd.mm.yyyy)你的数据库。

DECLARE
v_date  DATE;
v_er    EXCEPTION;
BEGIN
v_date := to_date('&v_date','dd.mm.yyyy');
dbms_output.put_line(v_date);
IF v_date > SYSDATE THEN
RAISE v_er;
END IF;
INSERT INTO hir_tb VALUES (103, 'abc', v_date, 25400);
EXCEPTION
    WHEN v_er THEN 
    dbms_output.put_line('Not a Valid Date');
END;