通过传递值使用触发器插入
Insertion using triggers by passing values
假设我有一个 table 如下--
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 期间允许 insertion/update 并阻止在任何其他时间插入。触发器构造(感谢@Melkikun)似乎没问题。但是现在我面临以下问题--
如何在此处传递值?我的意思是说我的创建语句是:
Insert into employees Values (1, 'someone', 11111, '17-12-2015')
现在时间是 12:30:01。触发器如何在不知道值的情况下执行插入?
让我们说现在是 13:00:1。如何触发 stop/prevent 插入?
我正在使用 Oracle SQL Developer 4.02.15
非常感谢
你只需要换一种方式。
如果时间不正确,那么你会引发一个异常,所以插入不会完成。
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;
How would the trigger perform the insertion without knowing the values?
由于 :NEW 和 :OLD,触发器知道该值。
您通常在触发器中使用术语,使用 :old 引用旧值,使用 :new 引用新值 value.So 你会得到 :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;
假设我有一个 table 如下--
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 期间允许 insertion/update 并阻止在任何其他时间插入。触发器构造(感谢@Melkikun)似乎没问题。但是现在我面临以下问题--
如何在此处传递值?我的意思是说我的创建语句是:
Insert into employees Values (1, 'someone', 11111, '17-12-2015')
现在时间是 12:30:01。触发器如何在不知道值的情况下执行插入?
让我们说现在是 13:00:1。如何触发 stop/prevent 插入?
我正在使用 Oracle SQL Developer 4.02.15 非常感谢
你只需要换一种方式。
如果时间不正确,那么你会引发一个异常,所以插入不会完成。
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;
How would the trigger perform the insertion without knowing the values?
由于 :NEW 和 :OLD,触发器知道该值。
您通常在触发器中使用术语,使用 :old 引用旧值,使用 :new 引用新值 value.So 你会得到 :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;