使用12c Trigger语句编译错误?

时间:2014-04-14 00:01:35

标签: sql oracle triggers oracle12c

第一篇帖子,这是一个大问题。我已经坚持了一段时间,并且它正在阻碍我的项目的其余部分 - 自从我在数据库开发方面做了很多工作以来已经很长时间了。我最后一次使用Oracle时它是11g,但是我试图从一个旧项目中重用的语法现在似乎不起作用而且我只是摸不着头脑。如果有人能指出我遗漏的(可能)显而易见的事情,我会非常感激感激不尽?

不确定我是否在这里张贴太多,所以如果是这样说的话。


这是表CREATE和TRIGGER语句

 1. CREATE
 2.   TABLE employees
 3.     (
 4.       Employee_id       NUMBER   (4)   NOT NULL ,
 5.       firstname         VARCHAR2 (64)  NOT NULL ,
 6.       surname           VARCHAR2 (64)  NOT NULL ,
 7.       email             VARCHAR2 (256) NOT NULL ,
 8.       telephone         VARCHAR2 (20) ,
 9.       emp_password      VARCHAR2 (32)  NOT NULL ,
 10.      startdate         DATE           NOT NULL ,
 11.      organisation_id   NUMBER   (3)   NOT NULL ,
 12.      department_id     NUMBER   (2)   NOT NULL ,
 13.      jobtitle_id       NUMBER   (3)   NOT NULL ,
 14.      user_level        NUMBER   (1)   NOT NULL ,
 15.       Emp_added_by      NUMBER   (4)   NOT NULL ,   
 16.       Emp_added_on      TIMESTAMP      NOT NULL ,
 17.       Emp_updated_by    NUMBER   (4)   NOT NULL ,
 18.       Emp_updated_on    TIMESTAMP      NOT NULL
 19.     ) ;

 20.   ALTER TABLE employees ADD CONSTRAINT employees_PK 
 21.     PRIMARY KEY ( employee_id ) ;

顺序和陈述;

22. CREATE SEQUENCE "seq_employee_id" MINVALUE 1 MAXVALUE 9999 INCREMENT BY 1 
23. START WITH 1 NOCACHE ORDER NOCYCLE ;

最后触发器给了我狗屎;

24. create or replace 
25. trigger trg_employees 
26. BEFORE 
27.  INSERT OR 
28.  UPDATE OF employee_id 
29.  ON employees FOR EACH ROW 
30. BEGIN 
31.   IF INSERTING THEN IF 
32.    :NEW.employee_id = NULL THEN
33.      SELECT seq_employee_id.NEXTVAL
34.      INTO :NEW.employee_id
35.      FROM sys.dual;
36.    END IF;
37.  END IF;
38.  /*format firstname to have initial capital letter*/
39.  :NEW.firstname := INITCAP(:NEW.firstname);
40.  /*format surname to have initial capital letter*/
41.  :NEW.surname := INITCAP(:NEW.surname);
42.  /*replace any characters other than digits with an empty string*/
43.  :NEW.telephone := REGEXP_REPLACE(:NEW.telephone, '[^[:digit:]]', '');
44.  /*adjust to (99999) 999999 format */
45.  :NEW.telephone := REGEXP_REPLACE(:NEW.telephone,
46.            '([[:digit:]]{5})([[:digit:]](6)', '(\1) \2');
47. END;

48. ELSIF UPDATING THEN
49.   SELECT SYSDATE INTO :NEW.employee_updated_on FROM sys.dual;
50. END IF;
51. END;

/*This trigger automatically inserts a timestamp into updated rows to show audit
details.*/
52. CREATE OR REPLACE TRIGGER trg_employee_update 
53. BEFORE UPDATE ON employees FOR EACH ROW 
54. BEGIN
  /* Update "employee_updated_on" to current system date*/
55.  :NEW.employee_updated_on := sysdate;
56. END;

我可以毫无困难地创建表,约束和顺序;但是当我运行触发器语句时,它会编译以下错误

4,7 PL / SQL:忽略SQL语句 4,14 PL / SQL:ORA-02289:序列不存在

现在显然序列确实存在,但我根本不知道为什么它无法识别它,因为我可以在我的数据库中查看序列。我不知道我在第10行SELECT seq_employee_id.NEXTVAL是否有语法错误,或许?

1 个答案:

答案 0 :(得分:0)

您在触发器中引用的序列不存在。

如果在CREATE SEQUENCE声明

中使用双引号,请使用双引号
CREATE SEQUENCE "seq_employee_id" MINVALUE 1 MAXVALUE 9999 INCREMENT BY 1 
START WITH 1 NOCACHE ORDER NOCYCLE ;

然后您将创建区分大小写的标识符。如果这样做,您需要使用双引号引用标识符,并在每次引用时使用正确的大小写。这通常很烦人,这就是为什么我永远不会建议创建区分大小写的标识符。

SELECT "seq_employee_id".NEXTVAL
  INTO :NEW.employee_id
  FROM sys.dual;

从11g开始,您可以通过直接分配序列来简化语句

:new.employee_id := "seq_employee_id".nextval;

实际上,我建议重新创建没有双引号的序列,并使用直接赋值给:new.employee_id

相关问题