oracle PL/SQL程序问题,涉及游标(求助)

sacredfire 2011-03-09 05:37:13
说明:
根据表Z_TEST的字段AAA的值来更新Z_TEST的字段BBB的值;
表ZZ_TEMPAGENCY的字段CODE和Z_TEST的字段aaa具有关联关系,然后取出ZZ_TEMPAGENCY的字段NEWCODE的值赋给Z_TEST的字段BBB;

Declare
tcode z_test.aaa%type;
Cursor cur1 Is select AAA from z_test for update of z_test.bbb;
Begin
Open cur1;
-- Loop
Fetch cur1 Into tcode;
dbms_output.put_line(tcode);--ok
Declare
tnewcode zz_tempagency.newcode%type;
Cursor cur2 is select zz_tempagency.newcode from zz_tempagency where ZZ_TEMPAGENCY.CODE=tcode;--问题出在这儿:条件中赋值有问题,查出来结果是空。为什么?
Begin
dbms_output.put_line('第二次打印tcode');
dbms_output.put_line(tcode);--tcode的值是期望的值
Open cur2;
Fetch cur2 into tnewcode;
dbms_output.put_line(tnewcode||'------');--tnewcode的值为空,为什么呢?
update z_test set z_test.bbb=tnewcode where z_test.aaa=tcode;
Close cur2;
End;
-- Exit When cur1%NotFound;

--End Loop;
Close cur1;
---Commit;
End;
...全文
93 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
li1229363 2011-03-12
  • 打赏
  • 举报
回复
update table1 set col2=table2.col2 from table2 where table1.col1=table2.col1

非要使用游标吗?
sacredfire 2011-03-11
  • 打赏
  • 举报
回复
使用了参数游标,并根据各位老大的意见调整了程序,还是不对,感觉参数传递不过去;请看测试和相应结果

1)
Declare
Cursor cur1 Is select AAA from z_test for update of z_test.bbb;
cur1_rec cur1%rowtype;
Cursor cur2(v_tcode in varchar2) is select zz_tempagency.newcode from zz_tempagency where ZZ_TEMPAGENCY.CODE=v_tcode;
cur2_rec cur2%rowtype;
Begin
Open cur1;
-- Loop
Fetch cur1 Into cur1_rec;
dbms_output.put_line('第一次打印code(即cur1_rec.AAA)='||cur1_rec.AAA);
Open cur2('022002');
dbms_output.put_line('第2次打印code(即cur1_rec.AAA)='||cur1_rec.AAA);
Fetch cur2 into cur2_rec;
dbms_output.put_line('newcode='||cur2_rec.newcode);
update z_test set z_test.bbb=cur2_rec.newcode where z_test.aaa=cur1_rec.AAA;
Close cur2;
-- Exit When cur1%NotFound;

--End Loop;
Close cur1;
---Commit;
End;

结果如下:
第一次打印code(即cur1_rec.AAA)=022002
第2次打印code(即cur1_rec.AAA)=022002
newcode=023001


2)
Declare
Cursor cur1 Is select AAA from z_test for update of z_test.bbb;
cur1_rec cur1%rowtype;
Cursor cur2(v_tcode ZZ_TEMPAGENCY.Newcode%type) is select zz_tempagency.newcode from zz_tempagency where ZZ_TEMPAGENCY.CODE=v_tcode;
cur2_rec cur2%rowtype;
Begin
Open cur1;
-- Loop
Fetch cur1 Into cur1_rec;
dbms_output.put_line('第一次打印code(即cur1_rec.AAA)='||cur1_rec.AAA);
Open cur2(cur1_rec.AAA);
dbms_output.put_line('第2次打印code(即cur1_rec.AAA)='||cur1_rec.AAA);
Fetch cur2 into cur2_rec;
dbms_output.put_line('newcode='||cur2_rec.newcode);
update z_test set z_test.bbb=cur2_rec.newcode where z_test.aaa=cur1_rec.AAA;
Close cur2;
-- Exit When cur1%NotFound;

--End Loop;
Close cur1;
---Commit;
End;
结果如下:
第一次打印code(即cur1_rec.AAA)=022002
第2次打印code(即cur1_rec.AAA)=022002
newcode=
kakaxi 2011-03-10
  • 打赏
  • 举报
回复
根据你的测试结果证明这样的用法是不可行的.你可能没有感觉到,你现在的方法就是学习ORACLE的一个主要方法:以实践为导向学习。
如果你还需要使用CUR2的话,把他移到第一个DECLEAR:

Cursor cur2(tmp_tcode Z_TEMPAGENCY.CODE%type) is
select zz_tempagency.newcode from zz_tempagency where ZZ_TEMPAGENCY.CODE=tmp_tcode;
Megan2008 2011-03-10
  • 打赏
  • 举报
回复
我看lz的程序的意思是procedure中又嵌套使用了procedure,这种方法我没有用过,不知道是否可用。
在更新的时候可以直接使用第一次游标的结果的
sacredfire 2011-03-10
  • 打赏
  • 举报
回复
刚才试了试,结果不对;谢谢
sacredfire 2011-03-10
  • 打赏
  • 举报
回复
1)主要是想学习下游标的使用。。。
2)如果有好的方法,欢迎赐教
  • 打赏
  • 举报
回复
--这个需求应该可以不用游标吧
update z_test zt set zt.bbb=(select zzt.newcode from zz_tempagency zzt
where zzt.code=zt.aaa and rownum=1)
where exists(select 1 from zz_tempagency zzt
where zzt.code=zt.aaa)

17,082

社区成员

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

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