Oracle触发错误



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

这两个表如下所示,例如

  • tableA columns: (product_id, product_name, manufacture)
  • tableB columns: (buyer, product_id)

我想做的是:在表a中插入新行后,如果其product_name为null,则触发表b上的更新。如果表b中的行与新插入的行具有相同的制造,则更新表b的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
)

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

因为它现在发布它看起来很好-你仍然得到TRIGGER T1 compiled之后的消息Errors: check compiler log -或者你在看SQL开发人员的编译器日志窗口中的旧错误?如果你不确定,右键单击编译器日志窗口,在重新运行之前选择"clear",看看当前代码真的产生了什么错误(如果有的话)。

您已经创建了混合大小写名称为"tableA"one_answers"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;

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

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

修改嵌套select语句from中的where子句"为多"的地方。制造=:新制造来"为多"的地方。manufacture = NEW.manufacture

相关内容

  • 没有找到相关文章

最新更新