2011-04-18 123 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