#Oracle最无奈错误PLS-00103
最近初学Oracle,各种语法还不熟悉,所以遇到了一个令很多初学者都很无语也无奈的错误PLS-00103。
自己尝试写一个Oracle简单的触发器,其中使用到一些基本语法,本以为会很轻松。(以下为初步代码)
SQL> create or replace trigger tri_dept
2 before insert or update or delete
3 on dept
4 declare
5 var_tag varchar2(10);
6 begin
7 if inserting then
8 var_tag:='insert';
9 elseif updating then
10 var_tag:='update';
11 elseif deleting then
12 var_tag:='delete';
13 end if;
14 insert into dept_log values(var_tag,sysdate);
15 end tri_dept;
16 /
警告: 创建的触发器带有编译错误。
结果执行后系统警告有编译错误,那就用show error;
检查吧。
SQL> show error;
TRIGGER TRI_DEPT 出现错误:
LINE/COL ERROR
-------- -------------------------------------------------------
6/9 PLS-00103: 出现符号 "UPDATING"在需要下列之一时:
:= . ( @ % ;
8/9 PLS-00103: 出现符号 "DELETING"在需要下列之一时:
:= . ( @ % ;
12/5 PLS-00103: 出现符号 "TRI_DEPT"在需要下列之一时:
if
这错误提示简直莫名,初学者(像我)一定大呼什么鬼好吗?
紧接着就陷入检查–重试–百度的循环,终于终于发现错误所在。在其他语言中甚至SQL通用语言中判断语句大多数使用的都是**elseif
或else if
此类关键词,但Oracle真的很特别,他的判断语句竟是elsif
,所以这个错误只是elsif
**写错[笑哭]。(以下是正确代码)
SQL> create or replace trigger tri_dept
2 before insert or update or delete
3 on dept
4 declare
5 var_tag varchar2(10);
6 begin
7 if inserting then
8 var_tag:='insert';
9 elsif updating then
10 var_tag:='update';
11 elsif deleting then
12 var_tag:='delete';
13 end if;
14 insert into dept_log values(var_tag,sysdate);
15 end tri_dept;
16 /
触发器已创建
成功!
所以基础语法还是很重要的!!!