触发器中的循环问题,请教各位高人.[在线给分]

caipeiwen 2008-10-15 10:57:29
oracle中,从一张表取出某一列值相等的若干行,依次插入到另一张表,想在触发器里面实现,请各位高手看看该这么写这个循环.


create or replace trigger production_trigger
before insert on ezoffice.qtsmt$t3057
for each row
declare
record_id number(20);
work_id number(20);
--
p_tranType char(20);
p_allowSmsRemind char(20);
p_pressDealType char(20);
--
begin
select decode(ezoffice.wf_activity.tranType,null,'0',ezoffice.wf_activity.tranType) into p_tranType from ezoffice.wf_activity;
select decode(ezoffice.wf_activity.allowSmsRemind,null,'0',ezoffice.wf_activity.allowSmsRemind) into p_allowSmsRemind from ezoffice.wf_activity;
select decode(ezoffice.wf_activity.pressDealType,null,'0',ezoffice.wf_activity.pressDealType) into p_pressDealType from ezoffice.wf_activity;
select ezoffice.hibernate_sequence.nextval into record_id from dual;
--record_id应用为QTSMT$T3057_ID的值
:new.QTSMT$T3057_ID:=record_id;
--从这里开始循环.
insert into EZOFFICE.wf_proceedActivity
(WF_ProceedActivity_Id,
wf_activity_id,
activityName,
activityDescription,
activityType,
allowStandFor,
allowCancel,
allowTransition,
participantType,
participantUser,
participantGroup,
participantUserName,
participantUserField,
pressType,
deadLineTime,
pressMotionTime,
activityDocumentation,
activityIcon,
activityBeginEnd,
transactType,
actiCommField,
needPassRound,
passRoundUserType,
passRoundUser,
passRoundUserGroup,
passRoundUserName,
passRoundUserField,
passRoundCommField,
participantRole,
passRoundRole,
activityClass,
activitySubProc,
subProcType,
PARTICIPANTGIVENORG,
PASSROUNDGIVENORG,
commentRange,
DOMAIN_ID,
operbutton,
form_id,
actiCommFieldType,
passRoundCommFieldType,
tranCustomExtent,
tranCustomExtentId
)
select ezoffice.hibernate_sequence.nextval,
wf_activity_id,
activityName,
activityDescription,
activityType,
allowStandFor,
allowCancel,
allowTransition,
participantType,
participantUser,
participantGroup,
participantUserName,
participantUserField,
pressType,
deadLineTime,
pressMotionTime,
activityDocumentation,
activityIcon,
activityBeginEnd,
transactType,
actiCommField,
needPassRound,
passRoundUserType,
passRoundUser,
passRoundUserGroup,
passRoundUserName,
passRoundUserField,
passRoundCommField,
participantRole,
passRoundRole,
activityClass,
activitySubProc,
subProcType,
PARTICIPANTGIVENORG,
PASSROUNDGIVENORG,
commentRange,
domain_id,
operButton,
form_id,
actiCommFieldType,
passRoundCommFieldType,
tranCustomExtent,
tranCustomExtentId
from EZOFFICE.wf_activity
where wf_workflowprocess_id = 32226;
update EZOFFICE.wf_proceedActivity set dealwithsign = 0,
wf_workflowprocess_id = 32226,
employee_id = 6527,
ttable_id = 32174,
trecord_id = record_id;
--到这都是要循环的.
end production_trigger;

...全文
176 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
插入时,当被取值的A列是null时,对应的新列B显示0,否者B列显示的就是A的值.
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mantisXF 的回复:]
因为返回了多行记录,返回一个记录到变量中。你要实现什么功能?[/Quote]

想实现类似rs.getString("allowSmsRemind")==null?"0":rs.getString("allowSmsRemind")这样的功能.
但oracle中没有 = ? : 这样的表达式.

怎么会返回了多个值呢.decode不是和case类似的吗? 应该只返回一个才对啊.
mantisXF 2008-10-15
  • 打赏
  • 举报
回复
因为返回了多行记录,返回一个记录到变量中。你要实现什么功能?[Quote=引用 4 楼 caipeiwen 的回复:]
引用 3 楼 mantisXF 的回复:
SQL codewhile EZOFFICE.wf_activity.wf_workflowprocess_id = 32226 loop
这样用好像是不正确的。要么把EZOFFICE.wf_activity.wf_workflowprocess_id值赋给一个变量,然后再进行判断。



我改成变量了.
编译成功.
但是当我insert的时候,这行报错:
select decode(ezoffice.wf_activity.tranType,null,'0',ezoffice.wf_activity.tranType) into p_tranType from ezoffice.wf_activity…
[/Quote]
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mantisXF 的回复:]
SQL codewhile EZOFFICE.wf_activity.wf_workflowprocess_id = 32226 loop
这样用好像是不正确的。要么把EZOFFICE.wf_activity.wf_workflowprocess_id值赋给一个变量,然后再进行判断。

[/Quote]

我改成变量了.
编译成功.
但是当我insert的时候,这行报错:
select decode(ezoffice.wf_activity.tranType,null,'0',ezoffice.wf_activity.tranType) into p_tranType from ezoffice.wf_activity;

ORA-01422: 实际返回的行数超出请求的行数.
mantisXF 2008-10-15
  • 打赏
  • 举报
回复
while EZOFFICE.wf_activity.wf_workflowprocess_id = 32226 loop
这样用好像是不正确的。要么把EZOFFICE.wf_activity.wf_workflowprocess_id值赋给一个变量,然后再进行判断。

[Quote=引用 1 楼 caipeiwen 的回复:]
我用 while EZOFFICE.wf_activity.wf_workflowprocess_id = 32226 loop时


错误:PLS-00357: 在此上下文中不允许表, 视图或序列引用 'EZOFFICE.WF_ACTIVITY.WF_WORKFLOWPROCESS_ID'
[/Quote]
hyrongg 2008-10-15
  • 打赏
  • 举报
回复
循环用游标呀
类似:

begin
for cur in(select employee_id from hr.employees)
loop
dbms_output.put_line(cur.employee_id);
end loop;
end;

caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
我用 while EZOFFICE.wf_activity.wf_workflowprocess_id = 32226 loop时


错误:PLS-00357: 在此上下文中不允许表, 视图或序列引用 'EZOFFICE.WF_ACTIVITY.WF_WORKFLOWPROCESS_ID'
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
自己解决了,是我想复杂了.做VB做时间长看思想没赚过过来,根本不需要循环的.
囧~~`
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
改了半天,编译对,但执行的时候还是有问题.

谁给思路啊,就是从A表中取值逐行插入到B表中.
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 linzhangs 的回复:]
引用 7 楼 caipeiwen 的回复:
插入时,当被取值的A列是null时,对应的新列B显示0,否者B列显示的就是A的值.

你描述的不久可以用decode实现吗?
[/Quote]

是可以用decode实现 但是当我select decode(ezoffice.wf_activity.tranType,null,'0',ezoffice.wf_activity.tranType)的时候,结果是多行,没法赋值给变量.
范佩西_11 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 caipeiwen 的回复:]
插入时,当被取值的A列是null时,对应的新列B显示0,否者B列显示的就是A的值.
[/Quote]
你描述的不久可以用decode实现吗?
caipeiwen 2008-10-15
  • 打赏
  • 举报
回复
刚才突然明白了,我select的结果是多行,但参数只是一个,对不上.

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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