【问题标题】:I am combining two tables for a trigger and am getting issues with creating it?我正在为触发器组合两个表并且在创建它时遇到问题?
【发布时间】:2012-10-18 02:13:42
【问题描述】:
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;
/

行/列错误


16/13 PLS-00103:在期待其中一个时遇到符号“=” 下列的: := 。 ( @ % ; 指标 在“=”之前插入符号“:=”以继续。

19/36 PLS-00103:在期待其中一个时遇到符号“_” 下列的: . ( , * @ % & - + ; / at mod 余数 rem return 返回 在哪里 ||多集 在“_”之前插入符号“.”以继续。

----------------------新代码和错误信息-------- -------------------

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 的错误:

行/列错误


13/2 PL/SQL:忽略 SQL 语句 15/20 PL/SQL:ORA-01745:无效的主机/绑定变量名 16/11 PLS-00103:在期待其中一个时遇到符号“=” 下列的: := 。 ( @ % ; 指标 在“=”之前插入符号“:=”以继续。

【问题讨论】:

    标签: plsql


    【解决方案1】:

    我认为,:new.dno = dnumber; 这一行导致了第一个问题(缺少冒号)。

    应该改成:new.dno := dnumber;

    第二期(感谢Mr. Glenn),请更新(删除tot _sals中的空格)Update DEPT Set tot_sals = tot _sals + :new.SAL;

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

    WHERE :new.DNAME :=d_name; 行似乎还有另一个问题。请将语句中的“:”删除为:

     WHERE :new.DNAME = d_name;
    

    【讨论】:

    • 我试过你的建议@Yogendra 它没有解决问题
    • 您是否仍然遇到问题中提到的这两个错误?
    • 我认为@YogendraSingh 是对的,但还有一些错误,例如tot _sals(包含额外空格)。
    • @Glenn :很好。我认为这是第二个问题。我会更新答案。
    • @user1748624 请参考更新的答案以纠正Glen先生发现的第二个问题。
    猜你喜欢
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多