MySQL存储过程太憋屈(对照oracle无所适从)

[复制链接]
查看11 | 回复4 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
本帖最后由 qingyun 于 2016-5-10 08:58 编辑
我在oralce里的存储过程,常见风格如下:

create proecedurexxx (...p_msg out varchar2)
as
begin
begin

SELECTxxintov_xfrom xxx where yy=p_x;
exception

when no_data_found then

p_msg:='订单['||p_x||']不存在!';

return;

when too_many_rows then

p_msg:='订单['||p_x||']有多个!';

return;
end;

begin
insert intoyy (....) values (...);
exception
when dup_val_on_index then

p_msg:='插入yy表 ...重复!';

return;
end;


begin

SELECTzz intov_xfromzzz where yy=p_z;
exception

when no_data_found then

p_msg:='任务['||p_z||']不存在!';

return;

when too_many_rows then

p_msg:='任务['||p_z||']有多个!';

return;
end;
updatezzz set .....;
if sql%rowcount=0
then

p_msg:='xx不存在,更新记录为0!';

return;
end if;

p_msg:='xx执行成功!';

exception
when others then
p_msg:='异常代码:'||SQLCODE ||' 异常信息:'||SQLERRM;
end;

以上是我个人编程oracle存储过程时,常见的习惯;
如今刚刚接触mysql 的存储过程,用的mysql最新版 5.7.12;
真是发现非常难用;
1.没有 retrun ;当然整个 过程体上 弄一个label, 然后哪里要退出,就leave 这个label; 这个就算了;
2. 异常没有针对某一句或几句sql的,全是全局异常; 这就麻烦了,万一个存储过程里,有两处地方可能插入主键冲突报错,我怎么判断是那个一个报错;如果第一个报错,我想用 exit,第二个我想用continue;
因为是全局异常,就很难区分,当然用程序变量做一定技巧处理,也可以实现,但是太麻烦了;
3. 捕捉不了未知异常, 没有像

exception

when others then

p_msg:='异常代码:'||SQLCODE ||' 异常信息:'||SQLERRM;

对 oracle,mysql 存储过程都很擅长的朋友,能否给些指导。


回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
额。这么悲催啊,我还准备把新产品用MySQL了

回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
lz请修改标题,还以为是存储设备
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
用postgresql吧,基本上和ORACLE一样,复杂的业务逻辑问题及多表关联的优化用mysql蛋疼!
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
客户指定用 mysql的,没办法了;关键存储过程怎么这么弱。
就是常见的异常捕获这一块,特别别扭;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行