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

时间:2015-12-17 12:58:49

标签: plsql oracle11g oracle-sqldeveloper

假设我有一张表格如下 -

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 非常感谢

1 个答案:

答案 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;