通过传递值使用触发器插入

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;