2014-02-09 29 views
0

我試着做到以下幾點:PL/SQL觸發器來概括行和更新其他行

寫觸發這樣一個部門的預算在部門支付給員工的工資總和(記員工只在部門工作的時間百分比)。所述DEPT表包括部門ID(DID),預算,經理ID,所述員工(EMP)表包括EMPID(EID),工資,獎金,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

編譯器迴應了我的錯誤 – jasonwzm

+0

發佈錯誤 –

回答

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

+0

您說得很好,但這顯然是一項家庭作業,所以關於現實世界中編程的建議是無關緊要的。 – APC

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; 

從你的描述它可能工作。