我尝试执行以下操作:
编写一个触发器,使部门的预算是支付给部门员工的工资总和(请记住,员工只在部门工作的时间百分比)。 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
答案 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)
你在一个地方遇到了几个问题。
你错过了“;” UPDATE语句后的符号 - 这是技术错误。
您的UPDATE语句会更改DEPT表中的所有行 - 我认为这不是您所期望的。
您的子查询可以返回多于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
);
您在DEP表上创建行级触发器并尝试更改正文中的DEPT表 - 您应该了解“变异表问题”:http://asktom.oracle.com/pls/asktom/ASKTOM.download_file?p_file=6551198119097816936
在多用户环境中,多个事务可以更改表中的数据 由于事务隔离,您的代码将获得无关的结果。请学习Oracle概念:http://docs.oracle.com/cd/B28359_01/server.111/b28318/consist.htm