2011-04-18 142 views
1

我有兩個表tableA和tableB。我想設置一個觸發器。一旦在tableA中發生插入,它可能會觸發tableB中的一些事件。oracle觸發錯誤

兩個表如下所示,例如,

  • 表A列:(產品,PRODUCT_NAME,製造)
  • tableB的列:(買家,PRODUCT_ID)

我想要什麼要做的是:在將新行插入到表A後,如果其product_name爲null,則觸發tableB上的更新。如果tableB中的行與新插入的製造商具有相同的製造商,則將tableB'product_id更新爲此新插入的product_id。

CREATE TRIGGER t1  

AFTER INSERT ON tableA  
FOR EACH ROW WHEN (NEW.product_name is NULL) 

BEGIN 

    UPDATE tableB 
     SET tableB.product_id = :NEW.product_id 
    WHERE tableB.product_id IN (SELECT tableA.product_id 
            FROM tableA 
            WHERE tableA.manufacture = :NEW.manufacture); 

END; 

它總是抱怨在SQL Developer中的幾個誤區:

Error(2,2): PL/SQL: SQL Statement ignored 
Error(2,120): PL/SQL: ORA-00933: SQL command not properly ended 
Error(2,36): PL/SQL: ORA-00904: "NEW"."product_id": invalid identifier 
Error: PLS-00801: internal error [ph2csql_strdef_to_diana:bind] 

更新:

CREATE TABLE "tableA" 
    (
    "PRODUCT_ID"  NUMBER PRIMARY KEY, 
    "PRODUCT_NAME" VARCHAR2(50 BYTE) DEFAULT NULL, 
    "MANUFACTURE" VARCHAR2(50 BYTE) DEFAULT NULL 
) 

CREATE TABLE "tableB" 
(
    "BUYER_ID"  NUMBER PRIMARY KEY, 
    "PRODUCT_ID" NUMBER DEFAULT NULL 
) 
+0

退房[此帖](http://publib.boulder.ibm.com /infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlt.doc/sqltmst324.htm),它有一個類似於你正在做的事情的例子。 – 2011-04-18 02:07:24

+0

問題是我認爲語法是正確的。我不是爲什麼oracle會抱怨。 – chnet 2011-04-18 02:19:33

+0

你可以發佈創建表語句嗎?它會幫助您重現您的確切問題。 – 2011-04-18 02:27:24

回答

4

你是否在同一時間得到所有這些錯誤,或者當你嘗試不同的事情時發生不同的錯誤?如果您在NEW.product_id之前省略了:並且PLS-00801可能來自
之間的空格(即: NEW.product_id),那麼ORA-00904(以及可能相關的ORA-00933)會出現。不知道如何在同一時間獲得兩者

因爲它現在發佈它看起來很好 - 你仍然收到TRIGGER T1 compiled之後的消息Errors: check compiler log - 或者你正在查看SQL Developer的編譯器日誌窗口中的舊錯誤嗎?如果您不確定,請在編譯器中單擊鼠標右鍵日誌窗口並在重新運行之前選擇'清除',以查看當前代碼是否真的生成了錯誤(如果有)

0

在SQL * Plus,你需要終止CREATE TRIGGER語句和/在一行。

根據您的SQL工具,您可能需要使用一些不同的方式來設置備用分隔符。

4

您已創建混合大小寫名稱「ta bleA「和」tableB「。這通常是Oracle一種不好的做法,並導致問題引用代碼中的表時,因爲他們必須在正確的情況下,被稱爲,雙引號括起來:

CREATE TRIGGER t1  

AFTER INSERT ON "tableA"  
FOR EACH ROW WHEN (NEW.product_name is NULL) 

BEGIN 

    UPDATE "tableB" 
     SET "tableB".product_id = :NEW.product_id 
    WHERE "tableB".product_id IN (SELECT "tableA".product_id 
            FROM "tableA" 
            WHERE "tableA".manufacture = :NEW.manufacture); 

END; 
+0

由於觸發器不會編譯這樣的不同錯誤,因此我假定表名不一致地發佈,並且實名必須全部大寫。無論如何值得指出。 – 2011-04-18 09:00:19

+0

是的,它可能不是發佈的問題,但是當我嘗試使用發佈的代碼重新創建問題時發生了什麼。而那些CREATE TABLE語句看起來像是從SQL Developer複製並粘貼的,但也許真正的表名是事後混合使用的。 – 2011-04-18 09:14:14

0

修改where子句中的從 嵌套select語句的WHERE 「表A」 .manufacture =:NEW.manufacture 到 WHERE 「表A」 .manufacture = NEW.manufacture