PL / SQL触发器对行进行求和并更新其他行

时间:2014-02-09 15:31:48

标签: sql oracle plsql

我尝试执行以下操作:

  

编写一个触发器,使部门的预算是支付给部门员工的工资总和(请记住,员工只在部门工作的时间百分比)。 DEPT 表包括Dept ID(已完成),Budget,ManagerID,员工(EMP)表包含EMPID(eid),SALARY,BONUS,AGE和 WORKS 表包含eid,Did,working_time。

我写的代码是:

CREATE TRIGGER BUDGET_CHK
BEFORE
    INSERT OR UPDATE OF BUDGET OR DELETE ON DEPT
    FOR EACH ROW
    BEGIN
       UPDATE DEPT
       SET BUDGET = 
       (SELECT SUM(E.SALARY)
       FROM EMP E, WORKS W, DEPT D
       WHERE E.eid=W.eid AND D.did=W.did
       GROUP BY W.did)
    END;

我是oracle的新手。有人可以纠正我吗?谢谢!

错误(来自以下评论):

pl/sql: sql statement ignored

ORA-00933 sql command not properly ended

Error(16): PLS-00103: Encountered the symbol "end-of-file" when expecting
  one of the following: ( begin case declare end exception exit for goto if
  loop mod null pragma raise return select update while with <an identifier>
  <a double-quoted delimited-identifier> <a bind variable> << continue close
  current delete fetch lock insert open rollback savepoint set sql execute
  commit forall merge pipe purge

2 个答案:

答案 0 :(得分:0)

    CREATE OR REPLACE TRIGGER dept_trigger before

  INSERT OR UPDATE OF budget ON dept 

  FOR EACH row 

  declare

  l_budget NUMBER;

  BEGIN

    SELECT SUM(sal) INTO l_budget

    FROM employees e

    INNER JOIN works w

    ON w.eid       =e.eid;

    IF :new.budget < l_budget THEN

      raise_application_error(-20001,'Out of budget');

    END IF;

  END;

根据您的描述,它可能会有效。

答案 1 :(得分:0)

你在一个地方遇到了几个问题。

  1. 你错过了“;” UPDATE语句后的符号 - 这是技术错误。

  2. 您的UPDATE语句会更改DEPT表中的所有行 - 我认为这不是您所期望的。

  3. 您的子查询可以返回多于1行 - 这意味着您将获得“ORA-01427:单行子查询返回多行”运行时错误 可能你想要这样的东西:

     UPDATE DEPT D  
     SET BUDGET =   
         (SELECT SUM(E.SALARY)  
          FROM EMP E, WORKS W  
          WHERE E.eid=W.eid   
          AND D.did=W.did)  
     WHERE EXISTS (SELECT *  
                   FROM EMP E, WORKS W  
                   WHERE E.eid=W.eid   
                   AND D.did=W.did  
     );
    
  4. 您在DEP表上创建行级触发器并尝试更改正文中的DEPT表 - 您应该了解“变异表问题”:http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936

  5. 在多用户环境中,多个事务可以更改表中的数据 由于事务隔离,您的代码将获得无关的结果。请学习Oracle概念:http://docs.oracle.com/cd/B28359_01/server.111/b28318/consist.htm