如何写出整洁清晰,异常(错误)处理得当的 procedure(function)?

alipaymate 2005-07-27 10:16:25
rt
...全文
258 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
laibagefei 2005-10-13
  • 打赏
  • 举报
回复
set serveroutput on --打开服务器端的输出功能
create or replace procedure TEST(
cur_date IN date
)
as
v_productid wap_d_download.productid%TYPE; --产品ID
v_contentid wap_d_download.contentid%TYPE; --内容ID

--从download表中查询
CURSOR cps_cursor is
select t.productid, t.contentid from wap_d_download t where t.id = '17826198';
row_download cps_cursor%ROWTYPE;

BEGIN
open cps_cursor;
LOOP
fetch cps_cursor into row_download;
exit when cps_cursor%NOTFOUND;

v_productid := row_download.productid; --将row_download中的productId字段值赋值给v_productid
v_contentid := row_download.contentid; --将row_download中的contentid字段值赋值给v_contentid
dbms_output.put_line('产品ID:'||row_download.productid);
--入库
insert into wap_d_cp_gain_test(pid,contentid) values (v_productid,v_contentid);

commit; --提交事务

END LOOP;

EXCEPTION when others then --异常处理
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
close cps_cursor;
END TEST;


请问各位达人,我刚写的这个Procedure执行时没有报错,但为什么dbms_output不能输出信息
而且还不能按要求向库中填入数据呢?????

谢谢
alipaymate 2005-07-28
  • 打赏
  • 举报
回复
觉得把注释放在 proce/funct 的上面. 更常规一些.
alipaymate 2005-07-27
  • 打赏
  • 举报
回复

大家都来贴段代码, 彼此学习一下!
alipaymate 2005-07-27
  • 打赏
  • 举报
回复
多谢 bzszp(SongZip) ( ) 信誉:159 !
bzszp 2005-07-27
  • 打赏
  • 举报
回复
这要根据你的业务规则来定义
比如
你的数据肯定不会返回负数
此时可以定义
when no_data_found then
return -1;
when other then
insert into tb_err(sqlcode,sqlerrm,...);
return -2;
alipaymate 2005-07-27
  • 打赏
  • 举报
回复
搞错了, 应该是函数 sf_cost

sf_cost(i_prodcode varchar2) return number

as
v_cost number(15,6);
begin

select cost
into v_cost
from products
where prodcode = i_prodcode;

exception
when no_data_found then
return ???;
when other then
insert into tb_err(sqlcode,sqlerrm,...);
return ???;
end;
alipaymate 2005-07-27
  • 打赏
  • 举报
回复
有个问题是.

比如我想得到一个 product 的 cost.

sp_cost(i_prodcode varchar2)
as
v_cost number(15,6);
begin

select cost
into v_cost
from products
where prodcode = i_prodcode;

exception
when no_data_found then
return ???;
when other then
insert into tb_err(sqlcode,sqlerrm,...);
return ???;
end;

就是如果产生异常后, 那么这个 sp_cost 是返回 0.0? 还是返回出错代码 sqlcode?
还是其他的什摸值 ...?

bzszp 2005-07-27
  • 打赏
  • 举报
回复
至少要保存错误编码,或者错误描述
此外,最好保存 出错的位置 例如 存储过程名称,或者 函数名称等。
如:
SQL> set serveroutput on
SQL> declare
2 n number;
3 begin
4 select 1 into n from dual where 1=2;
5 exception when others then
6 dbms_output.put_line(sqlcode);
7 dbms_output.put_line(sqlerrm);
8 end;
9 /
100
ORA-01403: 未找到数据

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.11
SQL>
tian00weiwei 2005-07-27
  • 打赏
  • 举报
回复
insert into t_errlog
values(sysdate,spname,错误位置标签,to_char(errcode,errmsg);
alipaymate 2005-07-27
  • 打赏
  • 举报
回复
这个错误信息表都保存哪些内容? 请教

bzszp 2005-07-27
  • 打赏
  • 举报
回复
另外,建议创建一个错误信息记录表,保存错误信息

...
exception
when others then
insert into tb_err(sqlcode,sqlerrm,...);
...
end;
...
bzszp 2005-07-27
  • 打赏
  • 举报
回复
异常处理?

begin
...
begin
...
exception when ...
end;
...
exception
...
end;
alipaymate 2005-07-27
  • 打赏
  • 举报
回复
贴段代码. 请大家评论,指点.

create or replace function sf_qtys
(
i_set_id in number,
i_partnum in varchar2,
i_date_from in date,
i_date_to in date
)
return number
as
v_qtys number(15,6) := 0.0;
begin
select sum(prodcap1)
into v_qtys
from k_worder_l
where set_id = i_set_id
and prodcode = i_partnum
and proddate >= i_date_from
and proddate <= i_date_to;

return v_qtys;

exception
when no_data_found then
return 0.0;
end sf_qtys;
waterfirer 2005-07-27
  • 打赏
  • 举报
回复
procedure(function)要加上注释,例外处理放在一块

create or replace function sf_qtys
/** ------------------------------------------------------------------------------
'
'
'
'
------------------------------------------------------------------------------ **/
(
i_set_id in number, --
i_partnum in varchar2, --
i_date_from in date, --
i_date_to in date --
)
return number
as
v_qtys number(15,6) := 0.0; --

/** 定义例外 **/
exceptionDataNotFind EXCEPTION; --没有数据

begin
select sum(prodcap1)
into v_qtys
from k_worder_l
where set_id = i_set_id
and prodcode = i_partnum
and proddate >= i_date_from
and proddate <= i_date_to;

return v_qtys;

exception
when no_data_found then
RAISE exceptionDataNotFind;

--例外处理
EXCEPTION
WHEN exceptionDataNotFind THEN
return 0.0;

WHEN OTHERS THEN
.......

end sf_qtys;

17,086

社区成员

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

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