0

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

4

1 に答える 1