pls-00103 出现符号if在需要下列之一时

wanglilin 2011-09-22 11:34:39
这个触发器的需求是当T_BUSI_PRESEND_MX表插入以后,触发update set codetype=...
由于codetype的值是需要刚插入的id来查询出来的,所以必须先得到刚插入的id的值:

create or replace trigger trg_after_table
after insert
on T_BUSI_PRESEND_MX
FOR EACH ROW
declare
tr_mxid varchar2(20);
if insert(T_BUSI_PRESEND_MX)
begin
update T_BUSI_PRESEND_MX set tr_mxid=(select id from T_BUSI_PRESEND_MX,inserted),CODETYPE=fn_numbertype(tr_mxid)
where id=tr_mxid;
end;
end if;

编译后 报标题错误,在线等 谢谢
...全文
1074 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoyoumou 2011-09-22
  • 打赏
  • 举报
回复
-- 你这个触发器有严重的错误!不说啦:自己先去了解Oracle触发器方面的知识吧!
luoyoumou 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luoyoumou 的回复:]

if insert(T_BUSI_PRESEND_MX) then
[/Quote]

-- 加个 then
luoyoumou 2011-09-22
  • 打赏
  • 举报
回复
if insert(T_BUSI_PRESEND_MX) then
007-x 2011-09-22
  • 打赏
  • 举报
回复
LZ逻辑不是很清晰,代码有语法错误,试着帮你改了下
CREATE OR REPLACE TRIGGER TRG_AFTER_TABLE
AFTER INSERT ON T_BUSI_PRESEND_MX
FOR EACH ROW
DECLARE
BEGIN
UPDATE T_BUSI_PRESEND_MX
SET TR_MXID = :NEW.ID--这个id是新记录的id, 如果要用TR_MXID栏位的话直接换掉就可以
, CODETYPE = FN_NUMBERTYPE(:NEW.TR_MXID)
WHERE ID = :NEW.TR_MXID;
EXCEPTION
WHEN OTHERS THEN
RETURN;
END;
END IF;
007-x 2011-09-22
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER TRG_AFTER_TABLE
AFTER INSERT ON T_BUSI_PRESEND_MX
FOR EACH ROW
LZ逻辑不是很清晰,代码有语法错误,试着帮你改了下
DECLARE
BEGIN
UPDATE T_BUSI_PRESEND_MX
SET TR_MXID = :NEW.ID--这个id是新记录的id, 如果要用TR_MXID栏位的话直接换掉就可以
, CODETYPE = FN_NUMBERTYPE(:NEW.TR_MXID)
WHERE ID = :NEW.TR_MXID;
EXCEPTION
WHEN OTHERS THEN
RETURN;
END;
END IF;
qq707909149 2011-09-22
  • 打赏
  • 举报
回复
沙发!
wanglilin 2011-09-22
  • 打赏
  • 举报
回复
问题好像出在
insert的那一行没有commit,然后触发器又开始update
所以产生冲突
wanglilin 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luoyoumou 的回复:]
引用 8 楼 luoyoumou 的回复:

引用 7 楼 wanglilin 的回复:

加了then也报错啊。这次不但报标题的错还多了一个
提示变量 tr_mxid 已声明 但从来没有使用过


变量名最好别与字段名相同:否则,有些时候,Oracle都不知道你的where条件到底是怎么比较?

where id=tr_mxid;


-- 还会有错误滴,接着弄吧...……
[/Quote]

到底是哪里错了撒 告诉我撒
wanglilin 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tx2730 的回复:]
LZ逻辑不是很清晰,代码有语法错误,试着帮你改了下

SQL code

CREATE OR REPLACE TRIGGER TRG_AFTER_TABLE
AFTER INSERT ON T_BUSI_PRESEND_MX
FOR EACH ROW
DECLARE
BEGIN
UPDATE T_BUSI_PRESEND_MX
SET TR_MXID = ……
[/Quote]

照这个写了 你里面没有用if 后面有end if
所以我把代码改成了这样
create or replace trigger trg_after_table
after insert
on T_BUSI_PRESEND_MX
declare
tr_mxid varchar2(20);

begin
update T_BUSI_PRESEND_MX set tr_mxid=new.id,CODETYPE=fn_numbertype(tr_mxid)
where id=tr_mxid;
end;

说 new id 标识符无效
sql statement ignored
luoyoumou 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luoyoumou 的回复:]

引用 7 楼 wanglilin 的回复:

加了then也报错啊。这次不但报标题的错还多了一个
提示变量 tr_mxid 已声明 但从来没有使用过


变量名最好别与字段名相同:否则,有些时候,Oracle都不知道你的where条件到底是怎么比较?

where id=tr_mxid;
[/Quote]

-- 还会有错误滴,接着弄吧....
luoyoumou 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wanglilin 的回复:]

加了then也报错啊。这次不但报标题的错还多了一个
提示变量 tr_mxid 已声明 但从来没有使用过
[/Quote]

变量名最好别与字段名相同:否则,有些时候,Oracle都不知道你的where条件到底是怎么比较?

where id=tr_mxid;
wanglilin 2011-09-22
  • 打赏
  • 举报
回复
加了then也报错啊。这次不但报标题的错还多了一个
提示变量 tr_mxid 已声明 但从来没有使用过

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧