假设我有一张表格如下 -
create table employees
(
eno number(4) not null primary key,
ename varchar2(30),
zip number(5) references zipcodes,
hdate date
);
我正在尝试用 -
创建一个触发器CREATE OR REPLACE TRIGGER TWELVE_ONE
BEFORE INSERT OR UPDATE
ON EMPLOYEES
FOR EACH ROW
DECLARE
V_DATE VARCHAR2 (10);
BEGIN
SELECT TO_CHAR (SYSDATE, 'hh24:mi:ss') INTO V_DATE FROM DUAL;
IF (V_DATE >= '12:00:01' AND V_DATE < '13:00:00')
THEN
INSERT INTO TABLE ?????
ELSE
ROLLBACK? TERMINATE TRANSACTION?
END IF;
END;
触发器的目的是允许在12:00-13:00期间插入/更新,并防止在任何其他时间插入。触发器构造(感谢@Melkikun)似乎没问题。但是现在我面临以下问题 -
如何在这里传递值?我的意思是说我的创建语句是:
Insert into employees Values (1, 'someone', 11111, '17-12-2015')
现在说时间是12:30:01。如果不知道值,触发器将如何执行插入?
现在说时间现在是13:00:1。触发器如何阻止/阻止插入?
我正在使用Oracle SQL Developer 4.02.15 非常感谢
答案 0 :(得分:1)
你必须以另一种方式去做。
如果时间不正确,则会引发异常,因此无法完成插入。
CREATE OR REPLACE TRIGGER TWELVE_ONE
BEFORE INSERT OR UPDATE
ON EMPLOYEES
FOR EACH ROW
DECLARE
V_DATE VARCHAR2 (10);
MyException exception;
BEGIN
SELECT TO_CHAR (SYSDATE, 'hh24:mi:ss') INTO V_DATE FROM DUAL;
IF (V_DATE < '12:00:01' OR V_DATE > '13:00:00')
THEN
raise MyException;
END IF;
EXCEPTION
When MyException then
ROLLBACK;
//output message ...
END;
触发器如何在不知道值的情况下执行插入?
触发器知道值,这要归功于:NEW和:OLD。
您通常使用:旧中的条款来引用旧值,使用:new 来引用新值。所以您将拥有:NEW.eno ,:NEW.ename ......
以下是Oracle文档中的示例:
CREATE OR REPLACE TRIGGER Print_salary_changes
BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
sal_diff number;
BEGIN
sal_diff := :new.sal - :old.sal;
dbms_output.put('Old salary: ' || :old.sal);
dbms_output.put(' New salary: ' || :new.sal);
dbms_output.put_line(' Difference ' || sal_diff);
END;