ORRACLEdb12触发器语法错误

时间:2017-06-14 01:46:57

标签: sql oracle

在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”在需要下列之一时:; <标识符> <双引号分隔标识符>

无论如何,我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

正如Gary Myers的评论中已经说明的那样 如果表名包含特殊字符,则必须用双引号引用表名,所以写

AFTER INSERT ON "销售" FOR EACH ROW

如果仍有错误,请尝试创建Minimal, Complete, and Verifiable example。如果没有特殊字符的表名可以重现错误,请使用不带特殊字符的表名。试试

BEGIN 
    NULL;
END;

语句而不是原始触发器文本,以查看触发器定义语句是否有效。

以下是我在屏幕截图和代码之间存在的差异。显然你添加了我提到的双引号。

enter image description here

你提到

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

如果您有一个包含不同代码的新问题,请发布一个新问题,不要更改此问题。

请编辑您的问题并将图片替换为图片所示的代码,并添加此代码引发的错误消息。