存储过程执行sql语句无数据的问题

ecjtuhr 2010-06-20 11:42:03
我写了个存储过程,如下:
CREATE OR REPLACE Procedure PRO_Update_dzk Is
v_count NUMBER;
v_hid Varchar2(30);
v_mlph VARCHAR2(50);
v_mlxz VARCHAR2(100);

Cursor cur_hid Is Select hid From T_DZK_TEMP t Where t.bz='0' Or t.flag='0'Order By t.pcsbm;


Begin
v_count:=0;
For cursor_hid In cur_hid Loop
v_count:=v_count+1;
v_h:='';
v_z:='';
v_hid:=cursor_hid.hid;
Select t.h,t.z into v_h,v_z From aa t Where t.hid=v_hid ; --此处有可能查出数据为空,属正常现象
If (v_h Is Null) And (v_z Is Null) Then
Delete From T_DZK_TEMP a Where a.hid=v_hid;
Else
Update T_DZK_TEMP a Set a.h=v_h ,a.z= v_z Where a.hid=v_hid;
End If;
if (v_count mod 1000 )=0 then
Commit;
end if;
End Loop;
Commit;
End ;

在上述红色标记的地方,有可能为空,我原本想,如果为空,那么就走下面的流程,可是存储过程却退出了报错,说无数据,请教怎么处理,如果为空那么继续下面的代码?
...全文
320 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqlife 2010-06-20
  • 打赏
  • 举报
回复
Select t.h,t.z From aa t Where t.hid=v_hid ;
查询结果是什么?
longfeih 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhangwonderful 的回复:]
先执行:select count(*) into v_count from aa t Where t.hid=v_hid;
再执行以下语句:
if v_count>0 then
Select t.h,t.z into v_h,v_z From aa t Where t.hid=v_hid;
else
--
end if;
[/Quote]


楼上的正解 也是最常用的办法
心中的彩虹 2010-06-20
  • 打赏
  • 举报
回复

--修剪了下 在试试看
CREATE OR REPLACE Procedure PRO_Update_dzk is
v_count NUMBER;
v_hid Varchar2(30);
v_mlph VARCHAR2(50);
v_mlxz VARCHAR2(100);
n number;

Cursor cur_hid Is Select hid From T_DZK_TEMP t Where t.bz='0' Or t.flag='0' Order By t.pcsbm;

Begin
v_count:=0;
For cur_hid_rec In cur_hid Loop
v_count:=v_count+1;
v_hid:=cur_hid_rec.hid;
Select count(*) into n From aa t Where t.hid=v_hid ;
if n>0 then
Select t.h,t.z into v_h,v_z From aa t Where t.hid=v_hid ;

Update T_DZK_TEMP a Set h=v_h ,z= v_z Where a.hid=v_hid;
else
Delete From T_DZK_TEMP a Where a.hid=v_hid;
end if;
End Loop;
Commit;
End ;
zhangwonderful 2010-06-20
  • 打赏
  • 举报
回复
先执行:select count(*) into v_count from aa t Where t.hid=v_hid;
再执行以下语句:
if v_count>0 then
Select t.h,t.z into v_h,v_z From aa t Where t.hid=v_hid;
else
--
end if;
ecjtuhr 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 asftrhgjhkjlkttttttt 的回复:]
用nvl转换字段,防止为空
[/Quote]
倒是可取的办法.
ecjtuhr 2010-06-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wkc168 的回复:]
For cur_hid_rec In cur_hid Loop

v_hid:=cur_hid_rec.hid;

if mod(v_count,1000)=0 then


改了这三个 试下看看
[/Quote]

没什么区别嘛!
心中的彩虹 2010-06-20
  • 打赏
  • 举报
回复
For cur_hid_rec In cur_hid Loop

v_hid:=cur_hid_rec.hid;

if mod(v_count,1000)=0 then


改了这三个 试下看看
心中的彩虹 2010-06-20
  • 打赏
  • 举报
回复

CREATE OR REPLACE Procedure PRO_Update_dzk is
v_count NUMBER;
v_hid Varchar2(30);
v_mlph VARCHAR2(50);
v_mlxz VARCHAR2(100);

Cursor cur_hid Is Select hid From T_DZK_TEMP t Where t.bz='0' Or t.flag='0'Order By t.pcsbm;


Begin
v_count:=0;
For cur_hid_rec In cur_hid Loop
v_count:=v_count+1;
v_h:='';
v_z:='';
v_hid:=cur_hid_rec.hid;
Select t.h,t.z into v_h,v_z From aa t Where t.hid=v_hid ;
--此处有可能查出数据为空,属正常现象
If (v_h Is Null) And (v_z Is Null) Then
Delete From T_DZK_TEMP a Where a.hid=v_hid;
Else
Update T_DZK_TEMP a Set h=v_h ,z= v_z Where a.hid=v_hid;
End If;
if mod(v_count,1000)=0 then
Commit;
end if;
End Loop;
Commit;
End ;




孤独剑_LPZ 2010-06-20
  • 打赏
  • 举报
回复
用nvl转换字段,防止为空

17,378

社区成员

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

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