1

我有两个表,tableA 和 tableB。我想设置触发器。一旦在 tableA 中发生插入,它可能会触发 tableB 中的一些事件。

两张表如下,例如,

  • tableA 列:(product_id,product_name,manufacturer)
  • tableB 列:(买家,product_id)

我想要做的是:在表A中插入一个新行后,如果它的product_name为空,则在表B上触发更新。如果 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 开发人员中抱怨几个错误:

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
)
4

4 回答 4

4

您是同时遇到所有这些错误,还是在尝试不同的事情时遇到不同的错误?如果您省略了:之前的 ORA-00904(以及可能相关的 ORA-00933),则会出现NEW.product_idPLS-00801 可能来自两者之间的空格
(即: NEW.product_id。不确定如何同时获得两者。

正如它现在发布的那样,它看起来很好 -Errors: check compiler log之后您是否仍然收到消息TRIGGER T1 compiled- 或者您是否正在查看 SQL Developer 的编译器日志窗口中的旧错误?如果您不确定,请在编译器日志窗口中单击鼠标右键并在重新运行之前选择“清除”,以查看当前代码真正生成了哪些错误(如果有)。

于 2011-04-18T08:40:38.880 回答
4

您已创建混合大小写名称“tableA”和“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;
于 2011-04-18T08:47:15.320 回答
0

在 SQL*Plus 中,您需要在一行CREATE TRIGGER中用 a 终止语句。/

根据您的 SQL 工具,您可能需要使用一些不同的方式来设置备用分隔符。

于 2011-04-18T08:34:12.993 回答
0

将嵌套选择语句中的 where 子句从 WHERE "tableA".manufacture = :NEW.manufacture 修改为 WHERE "tableA".manufacture = NEW.manufacture

于 2012-04-16T12:36:27.887 回答