0
CREATE OR REPLACE TRIGGER check_enumber
BEFORE INSERT on emp
FOR EACH ROW
Declare result NUMBER;
dnumber NUMBER;
d_name VARCHAR(20);
Begin
check_eno(:new.ENO, result);
IF result = -1 THEN
RAISE_APPLICATION_ERROR (-20502, 'deptno already exist');
insert into emp_audit(ENO,ENAME,SAL,DNAME) values 
(:new.ENO,:new.ENAME,:new.SAL,:new.DNAME);
END IF;

IF Find_Dn(:new.DNAME) = 1 THEN
Select DNO, DNAME INTO dnumber, d_name
FROM dept
WHERE :new.DNAME = d_name;
:new.dno = dnumber;
IF d_name = 'SALES' THEN
:new.COMM := 300;
Update DEPT Set tot_sals = tot_sals + :new.SAL;
Update DEPT Set tot_emps = tot_emps + 1;  
END IF;
END IF; 
END;
/

LINE/COLエラー


16/13 PLS-00103: 次のいずれかを想定しているときに、記号「=」が検出されました: := 。( @ % ; インジケータ 続行するには、「=」の前に「:=」記号が挿入されました。

19/36 PLS-00103: 次のいずれかを予期しているときに、記号「_」が検出されました: 。( , * @ % & - + ; / at mod剰余 rem return return where || multiset 記号 "." が "_" の前に挿入されて続きます。

----------------------------------新しいコードとエラー メッセージ----------------------- ----------------

SQL> CREATE OR REPLACE TRIGGER check_enumber
  2  BEFORE INSERT on emp
  3  FOR EACH ROW
  4     Declare result NUMBER;
  5     dnumber NUMBER;
  6     d_name VARCHAR(20);
  7  Begin
  8   check_eno(:new.ENO, result);
  9   IF result = -1 THEN
 10     RAISE_APPLICATION_ERROR (-20502, 'deptno already exist');
 11     insert into emp_audit(ENO,ENAME,SAL,DNAME) values
 12             (:new.ENO,:new.ENAME,:new.SAL,:new.DNAME);
 13   END IF;
 14
 15   IF Find_Dname(:new.DNAME) = 1 THEN
 16     Select DNO, DNAME INTO dnumber, d_name
 17     FROM dept
 18     WHERE :new.DNAME :=d_name;
 19     :new.dno = dnumber;
 20     IF d_name = 'SALES' THEN
 21     :new.COMM := 300;
 22     Update DEPT Set tot_sals = tot_sals + :new.SAL;
 23     Update DEPT Set tot_emps = tot_emps + 1;
 24     END IF;
 25     END IF;
 26  END;
 27  /

警告: トリガーはコンパイル エラーで作成されました。

SQL> エラーを表示します。TRIGGER CHECK_ENUMBER のエラー:

LINE/COLエラー


13/2 PL/SQL: SQL ステートメントは無視されました 15/20 PL/SQL: ORA-01745: 無効なホスト/バインド変数名 16/11 PLS-00103: 次のいずれかを予期しているときに、記号「=」が検出されました: := 。( @ % ; インジケータ 続行するには、「=」の前に「:=」記号が挿入されました。

4

1 に答える 1

0

:new.dno = dnumber;この行が最初の問題(コロンがない)を引き起こしていると思います。

に変更する必要があります:new.dno := dnumber;

2 番目の問題 (感謝Mr. Glenn) については、次のように更新してください (tot _sals のスペースを削除してください) Update DEPT Set tot_sals = tot _sals + :new.SAL;

 Update DEPT Set tot_sals = tot_sals + :new.SAL;

line に別の問題があるようWHERE :new.DNAME :=d_name;です。次のようにステートメントから「:」を削除してください。

 WHERE :new.DNAME = d_name;
于 2012-10-18T02:18:53.033 に答える