第一篇帖子,这是一个大问题。我已经坚持了一段时间,并且它正在阻碍我的项目的其余部分 - 自从我在数据库开发方面做了很多工作以来已经很长时间了。我最后一次使用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
是否有语法错误,或许?
答案 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
。