【发布时间】:2011-08-07 13:20:59
【问题描述】:
我有两个表,tableA 和 tableB。我想设置触发器。一旦在tableA中发生插入,它可能会触发tableB中的一些事件。
两个表如下,例如,
- tableA 列:(product_id、product_name、manufacturer)
- tableB 列:(buyer, 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
)
【问题讨论】:
-
查看this post,其中有一个与您尝试做的类似的示例。
-
问题是我认为语法是正确的。我不知道为什么 oracle 会抱怨。
-
您也可以发布创建表语句吗..?这将有助于重现您的确切问题..
-
我发布了它们。谢谢
-
使用存储过程对A进行插入和对B进行条件更新可能会更好。如果以后遇到问题,这种工作很难追溯到触发器。您也可能难以从触发器内的 A 中进行选择 - 我认为不知道 A 上的查询是否会包含当前插入的行,因此 Oracle 不会让您避免歧义。 (但可能取决于版本 - 不确定!)
标签: sql oracle triggers ora-00904 ora-00933