在Windows 10上的ORRACLEdb12中出现以下语法错误。
我尝试过使用和不使用这些引号,但它总是一样。
代码:
Create OR Replace
trigger InsertSale
After insert ON "销售" for each row
Begin
if INSERTING
then
update "商品" set 库存 = 库存 - :new.销售数量;
where 书ISBN = :new.书ISBN;
end if;
END;
截图:
有三个错误(抱歉是中文):
错误(4,32):PLS-00049:错误的赋值变量'新。销售数量'
错误(5,6):PLS-00103:出现符号“WHERE”在需要下列之一时:(开始案例声明其他elsif结束退出goto if loop mod null pragma raise return select update with with< an identifier&gt ;<双引号分隔标识符>< a绑定变量><<继续关闭当前删除提取锁定插入打开回滚保存点设置sql执行提交forall合并管道清除
错误(6,6):PLS-00103:出现符号“IF”在需要下列之一时:; <标识符> <双引号分隔标识符>
无论如何,我的代码出了什么问题?
答案 0 :(得分:0)
正如Gary Myers的评论中已经说明的那样 如果表名包含特殊字符,则必须用双引号引用表名,所以写
AFTER INSERT ON "销售" FOR EACH ROW
如果仍有错误,请尝试创建Minimal, Complete, and Verifiable example。如果没有特殊字符的表名可以重现错误,请使用不带特殊字符的表名。试试
BEGIN
NULL;
END;
语句而不是原始触发器文本,以查看触发器定义语句是否有效。
以下是我在屏幕截图和代码之间存在的差异。显然你添加了我提到的双引号。
你提到
Create OR Replace trigger InsertSale
After insert ON "销售"
for each row
Begin
NULL;
将编译没有错误。当然不会,因为END;
缺失。但也许你做了一个复制/粘贴错误。如果代码
Create OR Replace trigger InsertSale
After insert ON 销售
for each row
Begin
NULL;
END;
引发错误,但
Create OR Replace trigger InsertSale
After insert ON 销售
for each row
Begin
NULL;
END;
成功编译然后您可以修复代码中的错误。
但无论如何,您的错误原因是您的代码包含
AFTER INSERT ON 销售 FOR EACH ROW
而不是
AFTER INSERT ON "销售" FOR EACH ROW
如果您有一个包含不同代码的新问题,请发布一个新问题,不要更改此问题。
请编辑您的问题并将图片替换为图片所示的代码,并添加此代码引发的错误消息。