初投稿で大雑把です。私はしばらくこれに固執しており、それが私のプロジェクトの残りを支えています - データベース開発の方法で多くのことをしてから長い時間が経ちました. 前回 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
、おそらく?