12
返回列表 发新帖
楼主: zy_ly

近日学习oracle不得其解的问题

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2004-12-16 11:50 | 只看该作者
最初由 zy_ly 发布
[B]1、我是在子存储过程中捕获了异常,然后返回(还未执行commit语句),如果取消异常,万一真出现错误怎么办,另外在pl/sql develop 里调试为什么没问题
2、刚才我在测试第2个问题,客户端(两三个)、两个服务器的字符集是一致的,奇怪的是查询一个三四行记录的视图没问题,查询十几万的记录就报上述错 [/B]



1:  子存储过程捕获异常,也可以再 raise_application_error 啊,如果捕获了异常进行了处理不raise error 则调用环境认为是正常返回,你如果子存储过程不捕获异常,错误会返回到上层调用环境,也就是说会返回到父存储过程,进入父存储过程的异常啊。


2:如果相同的view,限定记录数没问题(比如 rownum < 11),而记录数多了就有问题,那就是在网络层 转换有bug 了。你说查询3个字段是任意3个字段都可以而任意4个字段都不可以吗? 还是有特定类型的存在?

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009日食纪念
日期:2009-07-22 09:30:00
12#
 楼主| 发表于 2004-12-16 12:42 | 只看该作者
1、关于第二个问题,我又反复测试(包括在其它机器上,当然环境一样),错误不尽相同,
   对于不同的view,记录字段较少的,select * from 没问题,对于大表即使限制rownum 也报同样的错,如果仅查一个字段肯定可以,多了就不敢保证(类型都是普通的),可能真是网络层 转换有问题。
2、在子过程里针对insert语句,写了如下异常
insert into ...................;
commit;
EXCEPTION           
   WHEN OTHERS THEN           
    V_OUT := -2 ;           
    ROLLBACK ;           
    RETURN ;         
在父过程里判断v_out,如果小于0,就报错,既然子过程触发异常,肯定就没有commit;如何达到目的

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
13#
发表于 2004-12-16 12:55 | 只看该作者
在父过程里判断v_out,如果小于0,就报错,既然子过程触发异常,肯定就没有commit;如何达到目的


不知道你到底要干什么,既然在异常里面 rollback ,那你还要 commit 干吗?
要不你把异常处理中的 rollback 去掉好了?  与 父 存储过程保持事物的一致?

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009日食纪念
日期:2009-07-22 09:30:00
14#
 楼主| 发表于 2004-12-16 14:02 | 只看该作者
是这样的,如果确实出现错误(如主键冲突),当然要rollback,并且return,由父过程判断v_out的正负,从而给应用人员报相应的错。我理解,如果insert语句正常(不违反任何约束),应该执行下面的commit提交数据库,然后继续执行下面代码,出现错误就rollback,返回负值(v_out初始为正)

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2004-12-16 14:35 | 只看该作者
那你在 每个过程中记录断点输出不行啊?看看到底执行了什么,没执行什么

插入表\写文件,或者 dbms_output 都可以啊

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009日食纪念
日期:2009-07-22 09:30:00
16#
 楼主| 发表于 2004-12-16 14:50 | 只看该作者
确实也是这样做的,通过dbms_output 又通过蛤蟆debug,就发现了这个问题,如果单执行此insert语句,没任何问题(v_out为正,可以提交),如果通过父过程调用,就报异常。而在pl/sql develop里执行没任何问题,相应的数提交到数据库,所以才感到疑惑

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
17#
发表于 2004-12-16 14:56 | 只看该作者
异常是什么异常呢?

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009日食纪念
日期:2009-07-22 09:30:00
18#
 楼主| 发表于 2004-12-16 15:02 | 只看该作者
通过就是dbms_output  扑捉sqlerrm及sqlcode,就是ora-0000的错

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
19#
发表于 2004-12-16 15:36 | 只看该作者
最初由 zy_ly 发布
[B]1、关于第二个问题,我又反复测试(包括在其它机器上,当然环境一样),错误不尽相同,
   对于不同的view,记录字段较少的,select * from 没问题,对于大表即使限制rownum 也报同样的错,如果仅查一个字段肯定可以,多了就不敢保证(类型都是普通的),可能真是网络层 转换有问题。
2、在子过程里针对insert语句,写了如下异常
insert into ...................;
commit;
EXCEPTION           
   WHEN OTHERS THEN           
    V_OUT := -2 ;           
    ROLLBACK ;           
    RETURN ;         
在父过程里判断v_out,如果小于0,就报错,既然子过程触发异常,肯定就没有commit;如何达到目的 [/B]


用raise _application_error看看抛出的是什么异常?

EXCEPTION           
   WHEN OTHERS THEN           
    V_OUT := -2 ;           
    ROLLBACK ;           
-->
EXCEPTION           
   WHEN OTHERS THEN           
   if sqlcode <> 0 then
     raise _application_error(-20901,'sqlcode = '||sqlcode||' sqlerrm'||sqlerrm);
   end if;

使用道具 举报

回复
论坛徽章:
3
会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:442009日食纪念
日期:2009-07-22 09:30:00
20#
 楼主| 发表于 2004-12-16 16:10 | 只看该作者
真该打脸,发现问题了
由于测试时是利用蛤蟆自己产生的匿名块,其中传递的参数实际是2位,但它默认的参数声明是char(200),结果在insert语句中触发异常value too large for column,而在子存储过程里仅rollback,return返回一个判断值,在父过程里通过判断值去显示sqlerrm,可能由于正常返回报ora-0000错误,猜测在pl/sql develop里执行时,其默认参数声明为string,没有具体长度,结果正确
再次向两位版主表示感谢,看来认真仔细是学习任何知识的基础

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表