﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-gyn-随笔分类-plsql</title><link>http://www.cnitblog.com/gyn/category/2448.html</link><description>Win32下的Perl，无用的select，停滞的Tk，结束吧....</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 10:42:33 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 10:42:33 GMT</pubDate><ttl>60</ttl><item><title>采编系统客户端网络的改造</title><link>http://www.cnitblog.com/gyn/archive/2006/06/02/11472.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 02 Jun 2006 08:23:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/06/02/11472.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/11472.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/06/02/11472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/11472.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/11472.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 采编系统客户端网络的改造														 																										关键词：						postgresql														数据库，						vlan														，						acl														，三层交换，路由							...&nbsp;&nbsp;<a href='http://www.cnitblog.com/gyn/archive/2006/06/02/11472.html'>阅读全文</a><img src ="http://www.cnitblog.com/gyn/aggbug/11472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-06-02 16:23 <a href="http://www.cnitblog.com/gyn/archive/2006/06/02/11472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql异常处理（4）</title><link>http://www.cnitblog.com/gyn/archive/2006/04/28/9847.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Fri, 28 Apr 2006 06:58:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/04/28/9847.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/9847.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/04/28/9847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/9847.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/9847.html</trackback:ping><description><![CDATA[
		<h2 style="margin: 13pt 0cm; text-align: center;" align="center">
				<span lang="EN-US">
						<font face="Arial">oracle-plsql</font>
				</span>
				<span style="font-family: 黑体;">异常处理（</span>
				<span lang="EN-US">
						<font face="Arial">4</font>
				</span>
				<span style="font-family: 黑体;">）</span>
		</h2>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<b>
						<span style="font-family: 宋体;">异常处理</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当异常生成之后，程序被中止，控制权交给异常处理模块，异常处理模块捕获当前异常句柄，并交由相应的程序处理；如果，异常促里模块没有捕捉到异常句柄，那么它将被传输到当前程序的外围。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">除非由一些特殊的要求，一般情况下异常将再当前程序的异常处理模块中被处理。异常处理模块以</span>
				<span lang="EN-US">EXCEPTION</span>
				<span style="font-family: 宋体;">开始</span>
				<span lang="EN-US">END;</span>
				<span style="font-family: 宋体;">结尾。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Declare</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>/*…………*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>/*…………*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>when /*</span>
				<span style="font-family: 宋体;">异常名称</span>
				<span lang="EN-US">*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>then /*</span>
				<span style="font-family: 宋体;">异常处理</span>
				<span lang="EN-US">*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>when other</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>then /*</span>
				<span style="font-family: 宋体;">异常处理</span>
				<span lang="EN-US">*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">异常处理模块的语法基本上以</span>
				<span lang="EN-US">CASE</span>
				<span style="font-family: 宋体;">一致，凡是在</span>
				<span lang="EN-US">when</span>
				<span style="font-family: 宋体;">中有定义的异常都将被处理，而没有的则被传输。一个特殊的异常处理语句是</span>
				<span lang="EN-US">WHEN OTHERS</span>
				<span style="font-family: 宋体;">。就想在（</span>
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">）中所说的，它会处理所有为被处理的异常，因此必须小心使用它，最好是在最外层的程序中。当然如果喜欢偷懒的，大可以在异常处理模块中只放一个</span>
				<span lang="EN-US">OTHERS</span>
				<span style="font-family: 宋体;">。注意，无论哪种情况，</span>
				<span lang="EN-US">OTHERS</span>
				<span style="font-family: 宋体;">只能这只在异常处理的最后一位。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">有趣的是，可以在一个</span>
				<span lang="EN-US">when</span>
				<span style="font-family: 宋体;">中处理多个异常句柄。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>When no_data_found or invalid_employee_id or dbms_ldap.invalid session</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>Then /*………..*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在这个例子里，有标准包的异常、自定义异常和非标准包中的异常。这些异常只能用</span>
				<span lang="EN-US">or</span>
				<span style="font-family: 宋体;">连接，不可以用</span>
				<span lang="EN-US">and</span>
				<span style="font-family: 宋体;">，因为只有一个异常能够生成。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">非</span>
				<span lang="EN-US">raise_application_error</span>
				<span style="font-family: 宋体;">生成的异常，如果没有被处理而一直传递到系统环境中，那么环境将视情况作出相应的反映。在</span>
				<span lang="EN-US">sqlplus</span>
				<span style="font-family: 宋体;">中，</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">将回滚所有</span>
				<span lang="EN-US">DML</span>
				<span style="font-family: 宋体;">对数据所做的修改。在</span>
				<span lang="EN-US">sqlplus</span>
				<span style="font-family: 宋体;">环境中，因为有自动回滚的存在，我们可以保留出现未被处理的异常的可能性；而在另外的一些环境中，则需要仔细设计最外层程序。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">捕捉任何有可能传出的异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">记录错误以便于分析。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">给外部环境一个信息，以便于其作出相应的处理。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">对于自定义异常，因为</span>
				<span lang="EN-US">sqlcode</span>
				<span style="font-family: 宋体;">值永远是</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">，所以当它被传出时，如果外围程序中没有定义相同名称的异常，我们将不知道是什么异常产生了。因此，不要将自定义异常传递出去。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在程序中处理几个互相独立的操作时，为了避免出现因为一个操作产生异常而使整个程序被中断的情况，有必要将这些独立的操作放在各自的虚拟块中。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Procedure change_data is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>Delete from employee where …..</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>When others then null;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>Update company set …….</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;">
				<span lang="EN-US">When others then null;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>Insert into company_history select * from company where ….</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>When others then null;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<b>
						<span lang="EN-US">Pl/sql</span>
				</b>
				<b>
						<span style="font-family: 宋体;">提供了一些内建的函数来帮助我们确定、分析异常。</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">SQLCODE</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这个函数在前面有提到过，它是一个用于返回当前模块中最近一次异常值的函数，或者说是非入栈程序的异常值。打个比方：如果在当前程序的异常模块中调用了另一个程序，</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">将当前程序及相应的环境变量（包括异常值）压入系统栈；在被调用程序中生成了一个值为</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">的异常，那么</span>
				<span lang="EN-US">sqlcode</span>
				<span style="font-family: 宋体;">将返回</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">；之后刚才的程序出栈，</span>
				<span lang="EN-US">sqlcode</span>
				<span style="font-family: 宋体;">返回当前异常值。需要注意的是，不要在异常模块之外使用它，这样不会有任何意义。当没有异常或在异常模块之外使用时，</span>
				<span lang="EN-US">SQLCODE</span>
				<span style="font-family: 宋体;">返回</span>
				<span lang="EN-US">0</span>
				<span style="font-family: 宋体;">；返回值</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">是指自定义异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">SQLERRM</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">接收异常值，返回相应的长度不超过</span>
				<span lang="EN-US">512</span>
				<span style="font-family: 宋体;">字节的描述语。如果没有传入异常值，则返回当前异常描述。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>Dbms_output.put_line( sqlerrm(-1403);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Sql&gt;/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Ora-1403: no data found</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在需要体构长度超过</span>
				<span lang="EN-US">512 </span>
				<span style="font-family: 宋体;">字节的描述时，</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">建议使用</span>
				<span lang="EN-US">dbms_utility.format_error_stack</span>
				<span style="font-family: 宋体;">。显然，用这个函数来判断一个异常是否为系统异常是很有用的，如果不是的话，将返回以下两种情况的一种。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">如果是一个负数：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>ora-nnnnn: message not found,; product=rdbms; facility=ora</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">如果是一个正数：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>-nnnnn: non-oracle exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">DBMS_UTILITY.FORMAT_ERROR_STACK</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">返回当前异常相应的描述，没有字符长度限制。与</span>
				<span lang="EN-US">SQLCODE</span>
				<span style="font-family: 宋体;">相同的是，必须在异常处理模块中使用。虽然名称中有一个</span>
				<span lang="EN-US">stack</span>
				<span style="font-family: 宋体;">在，但通过它并不能知道异常的最初生成处，需要的话就必须使用</span>
				<span lang="EN-US">DBMS_UTILITY.FORMAT_ERROR_BACKTRACE</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">DBMS_UTILITY.FORMAT_ERROR_BACKTRACE</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">系统为最近一次生成的异常设置了一个栈，并跟踪它的传递过程，而这个函数使用这个栈，然后返回该异常的整个传递过程。这个函数对错误的定位和实施下一步处理起着至关重要的作用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Create or replace procedure procl is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>Dbms_output.put_line(‘running proc1’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>Raise no_data_found;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>create or replace procedure proc2 is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>dbms_output.put_line(‘calling proc1’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>proc1;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>create or replace procedure proc3 is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>
						<span>       </span>dbms_output.put_line(‘calling proc2’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>proc2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>when no_data_found</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>dbms_output.put_line(‘error stack at top level’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>              </span>
						<span>       </span>dbms_output.put_line(dbms_utility.format_error_backtrace);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>       </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">现在可以运行</span>
				<span lang="EN-US">proc3</span>
				<span style="font-family: 宋体;">来看看结果。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Sql&gt;set serveroutput on;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Sql&gt;begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -42pt;">
				<span lang="EN-US">2<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">                         </span></span>
				<span lang="EN-US">dbms_output.put_line(‘proc3-&gt;proc2-&gt;proc1 backtrace’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -42pt;">
				<span lang="EN-US">3<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">                         </span></span>
				<span lang="EN-US">proc3;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">4<span>     </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">5<span>     </span>/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>Proc3 -&gt; Proc2 -&gt; Proc1 backtrace</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>calling proc2</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>calling proc1</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>running proc1</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>Error stack at top level:</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>ORA-06512: at "SCOTT.PROC1", line 4</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span>    </span>ORA-06512: at "SCOTT.PROC2", line 5</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;">
				<span lang="EN-US">ORA-06512: at "SCOTT.PROC3", line 4</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">事实上，每次异常的产生都将重置这个异常栈，只是最后一次从系统栈出栈的是最外层的程序块，所以可以清楚地看到异常生成的整个过程。上面这个程序的执行过程是这样的：首先用</span>
				<span lang="EN-US">put_line</span>
				<span style="font-family: 宋体;">打印</span>
				<span lang="EN-US">Proc3 -&gt; Proc2 -&gt; Proc1 backtrace</span>
				<span style="font-family: 宋体;">，</span>
				<span style="font-family: 宋体;">调用</span>
				<span lang="EN-US">proc3</span>
				<span style="font-family: 宋体;">，当前程序入栈</span>
				<span lang="EN-US">=&gt; </span>
				<span style="font-family: 宋体;">打印</span>
				<span lang="EN-US">calling proc2</span>
				<span style="font-family: 宋体;">，调用</span>
				<span lang="EN-US">proc2</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">proc3</span>
				<span style="font-family: 宋体;">入栈</span>
				<span lang="EN-US">=&gt;</span>
				<span style="font-family: 宋体;">打印</span>
				<span lang="EN-US">calling proc1</span>
				<span style="font-family: 宋体;">，调用</span>
				<span lang="EN-US">proc1</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">proc2</span>
				<span style="font-family: 宋体;">入栈</span>
				<span lang="EN-US">=&gt; </span>
				<span style="font-family: 宋体;">打印</span>
				<span lang="EN-US">running proc1</span>
				<span style="font-family: 宋体;">，生成</span>
				<span lang="EN-US">no_data_found</span>
				<span style="font-family: 宋体;">异常，该异常被压入异常栈中</span>
				<span lang="EN-US">=&gt;<span>  </span>proc2</span>
				<span style="font-family: 宋体;">出栈，并检测到来自第</span>
				<span lang="EN-US">5</span>
				<span style="font-family: 宋体;">行调用传递过来的异常，将它在此压入异常栈</span>
				<span lang="EN-US">=&gt; proc3</span>
				<span style="font-family: 宋体;">出栈，并检测到来自第</span>
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">行调用传递过来的异常，将它在此压入异常栈，</span>
				<span lang="EN-US">dbms_utility.format_error_backtrace</span>
				<span style="font-family: 宋体;">将异常栈中信息反相打印出来</span>
				<span lang="EN-US">=&gt;<span>  </span></span>
				<span style="font-family: 宋体;">最外层程序出栈，</span>
				<span lang="EN-US">end</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">以下是正确使用这个函数的一些注意事项：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">在当前程序的异常处理模块中调用这个函数。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">避免在中间程序中使用异常处理模块。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这样异常就能被正确地传输到最外层程序中，并打印出这个过程了。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/9847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-04-28 14:58 <a href="http://www.cnitblog.com/gyn/archive/2006/04/28/9847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql异常处理（3）</title><link>http://www.cnitblog.com/gyn/archive/2006/04/26/9675.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Wed, 26 Apr 2006 01:59:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/04/26/9675.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/9675.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/04/26/9675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/9675.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/9675.html</trackback:ping><description><![CDATA[
		<h2 style="margin: 13pt 0cm; text-align: center;" align="center">
				<span lang="EN-US">
						<font face="Arial">Oracle:pl/sql</font>
				</span>
				<span style="font-family: 黑体;">异常处理</span> （<span lang="EN-US"><font face="Arial">3）</font></span></h2>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<b>
						<span style="font-family: 宋体;">生成错误</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">处理</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">系统自动生成系统异常外，可以使用</span>
				<span lang="EN-US">raise</span>
				<span style="font-family: 宋体;">来手动生成错误。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span lang="EN-US">Raise exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span lang="EN-US">Raise package.exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">l<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span lang="EN-US">Raise;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">以上是</span>
				<span lang="EN-US">raise</span>
				<span style="font-family: 宋体;">的三种使用方法。第一种用于生成当前程序中定义的异常或在</span>
				<span lang="EN-US">standard</span>
				<span style="font-family: 宋体;">中的系统异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Declare</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Invalid_id exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Id_values varchar(2);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Id_value:=id_for(‘smith’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>If substr(id_value,1,1)!=’x’</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>Raise invalid_id;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>End if;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>When invalid_id</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>Dbms_output.put_line(‘this is an invalid id!’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这是一个生成自定义异常的例子，当然也可以生成系统异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>declare </span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>employee_id_in number;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">Select employee_id into employee_id_in from employ_list where employee_name=&amp;n;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">If employee_id_in=0</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">
						<span style="">       </span>Raise zero_devided;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;">
				<span lang="EN-US">End if;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>When zero_devided</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>Dbms_output.put_line(‘wrong!’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">有一些异常是定义在非标准包中的，如</span>
				<span lang="EN-US">UTL_FILE</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">DBMS_SQL</span>
				<span style="font-family: 宋体;">以及程序员创建的包中异常。可以使用</span>
				<span lang="EN-US">raise</span>
				<span style="font-family: 宋体;">的第二种用法来生成异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>If day_overdue(isbn_in, browser_in) &gt; 365</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>Raise overdue_pkg.book_is_lost</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>End if;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在最后一种</span>
				<span lang="EN-US">raise</span>
				<span style="font-family: 宋体;">的形式中，不带任何参数。这种情况只出现在希望将当前的异常传到外部程序时。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>When no_data_found</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>Then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>Raise;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Pl.sql</span>
				<span style="font-family: 宋体;">使用</span>
				<span lang="EN-US">raise_application_error</span>
				<span style="font-family: 宋体;">过程来生成一个有具体描述的异常。当使用这个过程时，当前程序被中止，输入输出参数被置为原先的值，但任何</span>
				<span lang="EN-US">DML</span>
				<span style="font-family: 宋体;">对数据库所做的改动将被保留，可以在之后用</span>
				<span lang="EN-US">rollback</span>
				<span style="font-family: 宋体;">命令回滚。下面是该过程的原型：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Procedure raise_application_error(</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Num binary_integer;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Msg varchar2;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Keeperrorstack Boolean default false</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">其中</span>
				<span lang="EN-US">num</span>
				<span style="font-family: 宋体;">是在</span>
				<span lang="EN-US">-20999</span>
				<span style="font-family: 宋体;">到</span>
				<span lang="EN-US">-20000</span>
				<span style="font-family: 宋体;">之间的任何数字（但事实上，</span>
				<span lang="EN-US">DBMS_OUPUT</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">DBMS_DESCRIBLE</span>
				<span style="font-family: 宋体;">包使用了</span>
				<span lang="EN-US">-20005</span>
				<span style="font-family: 宋体;">到</span>
				<span lang="EN-US">-20000</span>
				<span style="font-family: 宋体;">的数字）；</span>
				<span lang="EN-US">msg</span>
				<span style="font-family: 宋体;">是小于</span>
				<span lang="EN-US">2K</span>
				<span style="font-family: 宋体;">个字符的描述语，任何大于</span>
				<span lang="EN-US">2K</span>
				<span style="font-family: 宋体;">的字符都将被自动丢弃；</span>
				<span lang="EN-US">keeperrorstack</span>
				<span style="font-family: 宋体;">默认为</span>
				<span lang="EN-US">false</span>
				<span style="font-family: 宋体;">，是指清空异常栈，再将当前异常入栈，如果指定</span>
				<span lang="EN-US">true</span>
				<span style="font-family: 宋体;">的话就直接将当前异常压入栈中。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">    </span>CREATE OR REPLACE PROCEDURE raise_by_language (code_in IN PLS_INTEGER)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">    </span>IS</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>l_message error_table.error_string%TYPE;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">    </span>BEGIN</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>SELECT error_string</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">         </span>INTO l_message</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">         </span>FROM error_table, v$nls_parameters v</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">        </span>WHERE error_number = code_in</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">          </span>AND string_language<span style="">  </span>= v.VALUE</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">          </span>AND v.parameter = 'NLS_LANGUAGE';</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>RAISE_APPLICATION_ERROR (code_in, l_message);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">    </span>END;</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/9675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-04-26 09:59 <a href="http://www.cnitblog.com/gyn/archive/2006/04/26/9675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql异常处理（2）</title><link>http://www.cnitblog.com/gyn/archive/2006/04/23/9580.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 23 Apr 2006 13:31:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/04/23/9580.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/9580.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/04/23/9580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/9580.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/9580.html</trackback:ping><description><![CDATA[
		<h2 style="margin: 13pt 0cm; text-align: center;" align="center">
				<span lang="EN-US">
						<font face="Arial">Oracle:pl/sql</font>
				</span>
				<span style="font-family: 黑体;">异常处理（</span>
				<span lang="EN-US">
						<font face="Arial">2</font>
				</span>
				<span style="font-family: 黑体;">）</span>
		</h2>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">提供了强大而灵活的手段来捕捉和处理程序产生的异常，从而使</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">的用户远离一些令人烦恼的</span>
				<span lang="EN-US">bug</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<b>
						<span style="font-family: 宋体;">异常定义</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<b>
						<span lang="EN-US"> <o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在一个异常产生、被捕获并处理之前，它必须被定义。</span>
				<span lang="EN-US">Oracle</span>
				<span style="font-family: 宋体;">定义了几千个异常，绝大多数只有错误编号和相关描述，仅仅命名了若干个最常被用到的异常。这些名字被储存在</span>
				<span lang="EN-US">STANDARD</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">UTL_FILE</span>
				<span style="font-family: 宋体;">，</span>
				<span lang="EN-US">DBMS_SQL</span>
				<span style="font-family: 宋体;">这几个系统包中，详情请见</span>
				<span lang="EN-US">oracle:pl/sql</span>
				<span style="font-family: 宋体;">异常处理（</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">）。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">出自之外的绝大多数异常需要程序员命名。有</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">种命名异常的方法：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">：声明一个自定义异常</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">STANDARD</span>
				<span style="font-family: 宋体;">中的命名了的异常基本山是与系统的错误相关的（当然那些只有</span>
				<span lang="EN-US">errorcode</span>
				<span style="font-family: 宋体;">的异常也是这样），但在实际的应用中我们经常需要与特定的应用程序相关的异常，由程序员声明的异常就是用于处理这种情况的。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Oracle</span>
				<span style="font-family: 宋体;">异常处理模块的方便的地方在于，它并没有区别对待自定义的与预定义的异常。这使得我们可以像对待预定义异常一样，捕捉和处理自定义异常，只是在此之前需要声明它；同时对于一个自定义的异常，我们需要用</span>
				<span lang="EN-US">RAISE</span>
				<span style="font-family: 宋体;">来手动产生。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">下面是一个声明的例子：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>procedure calc_ammul_sales</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>(company_id_in in company.company_id%tye)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>invalid_company_id exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>negative_balance excrption;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>duplicate_company Boolean;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>/*body of executable statement*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>when invalid_company_id</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then /*handle exception*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>when no_data_found</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then /*handle exception*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>/*…..*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">需要注意的是处理定义的时候，只有两个地方会出现自定义的异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span lang="EN-US">raise exception</span>
				<span style="font-family: 宋体;">；</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span lang="EN-US">when exception then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">：为非预定义异常关联一个名字</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">仅仅</span>
				<span lang="EN-US">21</span>
				<span style="font-family: 宋体;">个预定义异常对我们来说实在是太少了，还有几千个异常只有</span>
				<span lang="EN-US">errorcode</span>
				<span style="font-family: 宋体;">和描述。另外，程序员也可以用</span>
				<span lang="EN-US">RAISE_APPLICATION_ERROR</span>
				<span style="font-family: 宋体;">定义一个含</span>
				<span lang="EN-US">errorcode</span>
				<span style="font-family: 宋体;">和描述的异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当然，只用</span>
				<span lang="EN-US">errorcode</span>
				<span style="font-family: 宋体;">也可以很好地完成工作，只要你不担心会忘了那串数字代表的意思就行。比方说</span>
				<span lang="EN-US">;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>when others</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">                     </span>if sqlcode=-1843 then<span style="">  </span>/*sqlcode</span>
				<span style="font-family: 宋体;">是内建的用于返回最近一次错误编号的函数</span>
				<span lang="EN-US">*/</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>…..</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">这的确是一段让人感到晦涩的代码，还是给它关联个名字吧。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">我们要用到的是</span>
				<span lang="EN-US">pragma exception_init(exception,integer)</span>
				<span style="font-family: 宋体;">，然后就可以像对待预定义异常一样对待它了，我是说没必要像上面的那种一样用</span>
				<span lang="EN-US">raise</span>
				<span style="font-family: 宋体;">。</span>
				<span lang="EN-US">Exception_init</span>
				<span style="font-family: 宋体;">是一个编译时运行的函数，它只能出现在代码的声明部分，而异常名字必须在此之前被定义。下面用一个匿名过程举个例子：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>declare</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>invalid_company_id exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>pragma exception_init(invalid_company_id, -1834);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">要注意的时：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">不可以用</span>
				<span lang="EN-US">-1403</span>
				<span style="font-family: 宋体;">（</span>
				<span lang="EN-US">no_data_found</span>
				<span style="font-family: 宋体;">），用</span>
				<span lang="EN-US">100</span>
				<span style="font-family: 宋体;">，事实上</span>
				<span lang="EN-US">exception_init</span>
				<span style="font-family: 宋体;">中的</span>
				<span lang="EN-US">integer</span>
				<span style="font-family: 宋体;">对应的是</span>
				<span lang="EN-US">sqlcode</span>
				<span style="font-family: 宋体;">返回的值。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">不能为</span>
				<span lang="EN-US">0</span>
				<span style="font-family: 宋体;">，不能大于</span>
				<span lang="EN-US">100</span>
				<span style="font-family: 宋体;">，不能小于</span>
				<span lang="EN-US">-1000000</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一个例子：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>procedure delete_company(company_id_in in number)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>still_have_emplyee exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>pragma exception(still_have_employee, -2293);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>delete from compamy</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>where company_id=company_id_in;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>when still_have_employee</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then dbms_output.put_line(‘delete employees for company first’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在一下两种情况下，我们有必要使用</span>
				<span lang="EN-US">exception_init</span>
				<span style="font-family: 宋体;">：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">一个非预定义异常是经常要被用到的。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">ü<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				<span style="font-family: 宋体;">我们将用</span>
				<span lang="EN-US">raise_applocation_error</span>
				<span style="font-family: 宋体;">产生了一个自定义的</span>
				<span lang="EN-US">errorcode</span>
				<span style="font-family: 宋体;">时。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">一种简便的方法是将以上两种情况中的异常定义在一个包中，这样我们就没有必要每次都重复定义了。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Create or replace package dynsql</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Invalid_table_name exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Pragma exception_init(invalid_table_name, -903);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Invalid_column_name exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Pragma exception_init(invalid_column_name, -904);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>En_too_young const number:=-200001;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Exc_too_young exception;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Pragma exception_init(exc_too_young, -20001);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>End;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">有了上面这个包，就可以方便的处理异常了</span>
				<span lang="EN-US">;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>procedure validate_emp(birthdate in date)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>min_tear const pls_integer:=18;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>if add_month(sysdate,min_year*12*-1)&lt;birthdate_in</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt;">
				<span lang="EN-US">raise_application_error(dynsql.en_too_young, ‘employee must be’ || min_year ||‘old’);</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>end if;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">除了</span>
				<span lang="EN-US">standard</span>
				<span style="font-family: 宋体;">包中的</span>
				<span lang="EN-US">21</span>
				<span style="font-family: 宋体;">个预定义异常外，还有一些包也定义了一些异常。但与</span>
				<span lang="EN-US">standard</span>
				<span style="font-family: 宋体;">包中异常不同的是，在使用这些异常时，需要带上包的名字。如：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>when dbms_lob.invalid_argval then ……</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">非常有用的一点是，可以在最外层的</span>
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">块的异常处理模块中加入</span>
				<span lang="EN-US">others</span>
				<span style="font-family: 宋体;">，这样就可以把从内部传递出来的未被处理的剩余异常全部处理掉了。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>When others</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>Then ….</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/9580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-04-23 21:31 <a href="http://www.cnitblog.com/gyn/archive/2006/04/23/9580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pl/sql异常处理（1）</title><link>http://www.cnitblog.com/gyn/archive/2006/04/23/9573.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 23 Apr 2006 07:36:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/04/23/9573.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/9573.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/04/23/9573.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/9573.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/9573.html</trackback:ping><description><![CDATA[
		<h2 style="margin: 13pt 0cm; text-align: center;" align="center">
				<span lang="EN-US">
						<font face="Arial">Oracle:pl/sql</font>
				</span>
				<span style="font-family: 黑体;">异常处理（</span>
				<span lang="EN-US">
						<font face="Arial">1</font>
				</span>
				<span style="font-family: 黑体;">）</span>
		</h2>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">提供了强大而灵活的手段来捕捉和处理程序产生的异常，从而使</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">的用户远离一些令人烦恼的</span>
				<span lang="EN-US">bug</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<b>
						<span lang="EN-US">pl/sql</span>
				</b>
				<b>
						<span style="font-family: 宋体;">异常处理的概念和术语</span>
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">中所有的错误都被认为是不应该发生的异常。一个异常可能是以下</span>
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">种情况的一种：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">u<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       </span></span>
				<span style="font-family: 宋体;">由系统产生的错误（“</span>
				<span lang="EN-US">out of memory</span>
				<span style="font-family: 宋体;">”或“</span>
				<span lang="EN-US">duplicate value in index</span>
				<span style="font-family: 宋体;">”）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">u<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       </span></span>
				<span style="font-family: 宋体;">用户行为导致的错误</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt;">
				<span style="font-family: Wingdings;" lang="EN-US">u<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       </span></span>
				<span style="font-family: 宋体;">应用程序给用户的一个警告</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">用一种异常句柄的结构来捕捉和响应错误。正是有了异常句柄的存在，我们能很方便的分离异常处理代码与可执行代码。与线性的代码相比，为了处理异常，异常句柄提供了一种类似事件驱动的模式；换句话说，就是不管一种特定的错误在何时何地发生，它都将被同一个代码处理。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当一个错误出现后，无论它是系统还是程序产生的，都将导致一个异常。之后，可执行程序被中断，控制权转移给异常处理代码。处理完异常后，程序将不会回到先前被中断的位置，相反的，控制权被交给了当前程序的外围模块（可能是程序，也可能是系统）。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>procedure jimmy</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>is</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
						<span style="">       </span>new_value varchar(35)</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>begin</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|--------new_value:=old_value || ‘-new’;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|<span style="">          </span>if new_value like ‘like%’</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|<span style="">          </span>then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|<span style="">          </span><span style="">       </span>…..</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|<span style="">          </span>end if;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|<span style="">   </span>exception</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 10.5pt;">
				<span lang="EN-US">|-----</span>
				<span style="font-family: Wingdings;" lang="EN-US">
						<span style="">à</span>
				</span>
				<span lang="EN-US">
						<span style="">       </span>when value_error</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>then</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">              </span>
						<span style="">       </span>…..</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>end;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">因为</span>
				<span lang="EN-US">old_value</span>
				<span style="font-family: 宋体;">是一个未被定义的变量，所以将产生一个错误，并将给异常处理模块处理。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">从异常的可应用范围出发，可将异常分为两类：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">系统异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">由</span>
				<span lang="EN-US">oracle</span>
				<span style="font-family: 宋体;">定义并由</span>
				<span lang="EN-US">pl/sql runtime</span>
				<span style="font-family: 宋体;">引擎在检测到错误时产生的异常。一些系统异常有名字，比如</span>
				<span lang="EN-US">NO_DATA_FOUND</span>
				<span style="font-family: 宋体;">，然而大多数的异常仅仅只有数字编号和描述。这些异常无论在哪个</span>
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">中程序都能被应用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">共有</span>
				<span lang="EN-US">21</span>
				<span style="font-family: 宋体;">个命名的系统异常：</span>
		</p>
		<table style="border: medium none ; margin-left: 21pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
				<tbody>
						<tr>
								<td style="border: 0.5pt solid windowtext; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">命名的系统异常</span>
										</p>
								</td>
								<td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext rgb(212, 208, 200); border-width: 0.5pt 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">产生原因</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">ACCESS_INTO_NULL</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">未定义对象</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">CASE_NOT_FOUND</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">CASE</span>
												<span style="font-family: 宋体;">中若未包含相应的</span>
												<span lang="EN-US">WHEN</span>
												<span style="font-family: 宋体;">，并且没有设置</span>
												<span lang="EN-US">ELSE</span>
												<span style="font-family: 宋体;">时</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">COLLECTION_IS_NULL</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">集合元素未初始化</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">CURSER_ALREADY_OPEN</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">游标已经打开</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">DUP_VAL_ON_INDEX</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">唯一索引对应的列上有重复的值</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">INVALID_CURSOR</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">在不合法的游标上进行操作</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">INVALID_NUMBER</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">内嵌的</span>
												<span lang="EN-US">sql</span>
												<span style="font-family: 宋体;">语句不能将字符转换为数字</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">NO_DATA_FOUND</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">使用</span>
												<span lang="EN-US">select into</span>
												<span style="font-family: 宋体;">未返回行，或应用索引表未初始化的元素时</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">TOO_MANY_ROWS</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">执行</span>
												<span lang="EN-US">select iotn</span>
												<span style="font-family: 宋体;">时，返回超过一行</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">ZERO_DIVIDE</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">除数为</span>
												<span lang="EN-US">0</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">SUBSCRIPT_BEYOND_COUNT</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">元素下标超过嵌套表或</span>
												<span lang="EN-US">VARRAY</span>
												<span style="font-family: 宋体;">的最大值</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">SUBSCRIPT_OUTSIDE_LIMIT</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">使用嵌套表或</span>
												<span lang="EN-US">VARRAY</span>
												<span style="font-family: 宋体;">时，将下标指定为负数</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">VALUE_ERROR</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">赋值时，变量长度不足以容纳实际数据</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">LOGIN_DENIED</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">Pl/sql</span>
												<span style="font-family: 宋体;">应用程序连接到</span>
												<span lang="EN-US">oracle</span>
												<span style="font-family: 宋体;">数据库时，提供了不正确的用户名或密码</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">NOT_LOGGED_ON</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">Pl/sql</span>
												<span style="font-family: 宋体;">应用程序在没有连接</span>
												<span lang="EN-US">oralce</span>
												<span style="font-family: 宋体;">数据库的情况下访问数据</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">PROGRAM_ERROR</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">Pl/sql</span>
												<span style="font-family: 宋体;">内部问题，可能需要重装数据字典＆</span>
												<span lang="EN-US">pl./sql</span>
												<span style="font-family: 宋体;">系统包</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">ROWTYPE_MISMATCH</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">宿主游标变量与</span>
												<span lang="EN-US">pl/sql</span>
												<span style="font-family: 宋体;">游标变量的返回类型不兼容</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">SELF_IS_NULL</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">使用对象类型时，在</span>
												<span lang="EN-US">null</span>
												<span style="font-family: 宋体;">对象上调用对象方法</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">STORAGE_ERROR</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">运行</span>
												<span lang="EN-US">pl/sql</span>
												<span style="font-family: 宋体;">时，超出内存空间</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">SYS_INVALID_ID</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="font-family: 宋体;">无效的</span>
												<span lang="EN-US">ROWID</span>
												<span style="font-family: 宋体;">字符串</span>
										</p>
								</td>
						</tr>
						<tr>
								<td style="border-style: none solid solid; border-color: rgb(212, 208, 200) windowtext windowtext; border-width: medium 0.5pt 0.5pt; padding: 0cm 5.4pt; width: 208.5pt; background-color: transparent;" valign="top" width="278">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">TIMEOUT_ON_RESOURCE</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(212, 208, 200) windowtext windowtext rgb(212, 208, 200); border-width: medium 0.5pt 0.5pt medium; padding: 0cm 5.4pt; width: 196.6pt; background-color: transparent;" valign="top" width="262">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span lang="EN-US">Oracle</span>
												<span style="font-family: 宋体;">在等待资源时超时</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">由程序员定义的异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">程序员在程序中定义的异常，它只是在特定的程序种有效。可以使用</span>
				<span lang="EN-US">EXCEPTION_INT</span>
				<span style="font-family: 宋体;">这个</span>
				<span lang="EN-US">pragma</span>
				<span style="font-family: 宋体;">将一个无名字的系统异常与一个程序员定义的名字相关联。或者用</span>
				<span lang="EN-US">RAISE_APPLICATION_ERROE</span>
				<span style="font-family: 宋体;">来自己定义一个异常的数字编号和描述。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">按异常生成方式可分为：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">预定义异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">就是上面表中的</span>
				<span lang="EN-US">21</span>
				<span style="font-family: 宋体;">种有名字的系统异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">非预定义异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">没名字的系统异常，可以用</span>
				<span lang="EN-US">pragma exception_int</span>
				<span style="font-family: 宋体;">给它关联一个名字。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">自定义异常：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">需要用</span>
				<span lang="EN-US">RAISE</span>
				<span style="font-family: 宋体;">或</span>
				<span lang="EN-US">RAISE_APPLICATION_ERROR</span>
				<span style="font-family: 宋体;">生成的异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span lang="EN-US"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">下面是一些要用到的属于</span>
				<span lang="EN-US">;</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Exception section</span>
				<span style="font-family: 宋体;">（异常处理模块）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">它是</span>
				<span lang="EN-US">pl/sql</span>
				<span style="font-family: 宋体;">语句块种包含一个或多个异常句柄的部分。</span>
				<span lang="EN-US">Exception section</span>
				<span style="font-family: 宋体;">的结构基本上与</span>
				<span lang="EN-US">case</span>
				<span style="font-family: 宋体;">相似。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Raise</span>
				<span style="font-family: 宋体;">（产生）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">通过通知</span>
				<span lang="EN-US">pl/sql runtime</span>
				<span style="font-family: 宋体;">引擎有错误来中止当前程序的运行。也可通过显式的请求，如：</span>
				<span lang="EN-US">RAISE</span>
				<span style="font-family: 宋体;">或</span>
				<span lang="EN-US">RAISE_APPLICATION_ERROR</span>
				<span style="font-family: 宋体;">来</span>
				<span lang="EN-US">RAISE</span>
				<span style="font-family: 宋体;">一个异常。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Handle</span>
				<span style="font-family: 宋体;">（句柄，某一个异常处理的代码）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">在</span>
				<span lang="EN-US">exception section</span>
				<span style="font-family: 宋体;">中捕捉错误。可以在</span>
				<span lang="EN-US">handle</span>
				<span style="font-family: 宋体;">中编写程序来处理异常，比如将错误记入</span>
				<span lang="EN-US">log</span>
				<span style="font-family: 宋体;">中，显示一个错误信息，将异常传出当前程序快。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Scope</span>
				<span style="font-family: 宋体;">（作用范围</span>
				<span lang="EN-US">）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">一个异常从产生、被捕捉到处理整个过程所处的程序部分。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Propagation</span>
				<span style="font-family: 宋体;">（传递）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">如果一个异常没有被处理，那么它将被传递到但前块的上一级，它有可能是另一个代码快，也可能是系统。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Unhandled exception</span>
				<span style="font-family: 宋体;">（未被处理的异常）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;">
				<span style="font-family: 宋体;">如果一个异常没有被处理，并一直被传递道理系统中，那么它被称为</span>
				<span lang="EN-US">unhandled exception</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Un-named or anonymous excepttion</span>
				<span style="font-family: 宋体;">（匿名异常）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">（在异常类型中有介绍）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">Named exception</span>
				<span style="font-family: 宋体;">（命名异常）</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">包括系统异常中有名字的那部分和用户定义的名字。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/9573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-04-23 15:36 <a href="http://www.cnitblog.com/gyn/archive/2006/04/23/9573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>plsql trunc(with date)函数的介绍</title><link>http://www.cnitblog.com/gyn/archive/2006/04/16/9235.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 16 Apr 2006 08:20:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2006/04/16/9235.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/9235.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2006/04/16/9235.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/9235.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/9235.html</trackback:ping><description><![CDATA[（网上有很多荒谬的中文介绍，可以去google看看。）<br /><br />在pl/sql中，trunc函数返回由指定测量单位截取的时间值。<br />trunc函数的语法如下：<br />      trunc(date, [format])<br />date就是要被截取的时间值。<br />format是用于截取的测量单位。如果省略的话date将被截取到day的精度。<br />format参数表：<br />   unit                                          valid format parameters<br />   Year                              SYYY,YYYY,YEAR,SYEAR,YYY,YY,Y<br />   ISO YEAR                                       IYYY,IY,I<br />   Quarter                                                      Q<br />   Month                                       MONTH,MON,MM,RM<br />   Week                                                      WW<br />   IW                                                            IW<br />   W                                                             W<br />   Day                                                      DDD,DD,J<br />   Start day of week                                 DAY,DY,D<br />   Hour                                                HH,HH12,HH24<br />   Minute                                                    MI<br />例子：<br />trunc(to_date("22-AUG-03"), "YEAR")      返回‘01-JAN-03’<br />trunc(to_date("22-AUG-03"), "Q")      返回‘01-JUL-03’<br />trunc(to_date("22-AUG-03"), "MONTH")      返回‘01-AUG-03’<br />trunc(to_date("22-AUG-03"), "DDD")      返回‘22-AUG-03’<br />trunc(to_date("22-AUG-03"), "DAY")      返回‘17-AUG-03’<br /><br />详情请见<a href="http://www.techonthenet.com/oracle/index.php">http://www.techonthenet.com/oracle/index.php</a><img src ="http://www.cnitblog.com/gyn/aggbug/9235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2006-04-16 16:20 <a href="http://www.cnitblog.com/gyn/archive/2006/04/16/9235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>