我有两个表,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