📄 第八章 pl-sql子程序 - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<LI><A href="http://blog.chinaunix.net/u1/44734/article_62693.html">·
文摘<!-- a62693 --></A><!-- 62693 -->
<LI><A href="http://blog.chinaunix.net/u1/44734/article_82547.html">·
JavaScript<!-- a82547 --></A><!-- 82547 -->
<LI><A href="http://blog.chinaunix.net/u1/44734/article_83441.html">·
Linux <FONT face="Wingdings 3">}</FONT></A>
<UL class=ul2>
<LI><A
href="http://blog.chinaunix.net/u1/44734/article_83906.html">· VIM<!-- a83906 --></A><!-- 83906 --> </LI></UL>
<LI><A href="http://blog.chinaunix.net/u1/44734/article_62689.html">·
杂谈<!-- a62689 --></A><!-- 62689 -->
<LI><A href="http://blog.chinaunix.net/u1/44734/article_89165.html">·
Windows<!-- a89165 --></A><!-- 89165 --> </LI></UL></LI>
<LI class=ul0><A class=list1
href="http://blog.chinaunix.net/u1/44734/index.html">首页</A> </LI></UL></TD>
<TD width=10></TD></TR>
<TR>
<TD colSpan=4>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0
cellPadding=0 width=980 border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<SCRIPT language=javascript>function $(s){return document.getElementById(s);}function ShowHideDiv(divid,iImg){if($(divid).style.display == "none"){iImg.src="../../templates/newgreen/images/dot2.gif";$(divid).style.display = "block";iImg.title="收起";}else{iImg.src="../../templates/newgreen/images/dot4.gif";$(divid).style.display = "none";iImg.title="展开";}}navHover();</SCRIPT>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD height=3></TD></TR></TBODY></TABLE><BR>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#111111 cellSpacing=0
cellPadding=0 width="90%" align=center border=0>
<TBODY>
<TR>
<TD width=18 height=28><IMG alt=""
src="第八章 PL-SQL子程序 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_left_top.gif"
border=0></TD>
<TD
background="第八章 PL-SQL子程序 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_top.gif">
<P style="MARGIN: 5px; LINE-HEIGHT: 150%"></P></TD>
<TD width=18 height=28><IMG alt=""
src="第八章 PL-SQL子程序 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_right_top.gif"
border=0></TD></TR>
<TR>
<TD width=18
background="第八章 PL-SQL子程序 - PL-SQL用户指南与参考 - whatiswhat.files/bg_art_left.gif"></TD>
<TD align=middle bgColor=#f5fdee><BR><FONT style="FONT-SIZE: 14pt"
color=#295200><B>第八章 PL/SQL子程序</B></FONT>
<TABLE style="BORDER-COLLAPSE: collapse" borderColor=#a5bd6b cellSpacing=1
cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD align=middle>
<TABLE style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE
style="BORDER-COLLAPSE: collapse; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<DIV id=art style="MARGIN: 15px">
<DIV class=postTitle><A class=postTitle2
id=AjaxHolder_ctl01_TitleUrl
href="http://www.cnblogs.com/cxd4321/archive/2008/03/19/1113188.html">第八章
PL/SQL子程序</A> </DIV>
<P class=title1>一、什么是子程序</P>
<P>子程序就是能够接受参数并被其他程序所调用的命名PL/SQL块。PL/SQL子程序有两种类型,过程和函数。一般地,过程用于执行一个操作,而函数用于计算一个结果值。</P>
<P>与未命名或匿名PL/SQL块一样,子程序也有声明部分,执行部分和一个可选的异常处理部分。声明部分包含类型、游标、常量、变量、异常和嵌套子程序的声明。这些内容都是本地的,在程序退出时会自动销毁。执行部分包含赋值语句、流程控制语句和Oracle的数据操作语句。异常处理部分包含异常处理程序。思考下面用于记入借方银行账户的debit_account过程:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>PROCEDURE</STRONG> debit_account(acct_id <STRONG>INTEGER</STRONG>, amount <STRONG>REAL</STRONG>) <STRONG>IS</STRONG><BR> old_balance <STRONG>REAL</STRONG>;<BR> new_balance <STRONG>REAL</STRONG>;<BR> overdrawn <STRONG>EXCEPTION</STRONG>;<BR><STRONG>BEGIN</STRONG><BR> <STRONG>SELECT</STRONG> bal<BR> <STRONG>INTO</STRONG> old_balance<BR> <STRONG>FROM</STRONG> accts<BR> <STRONG>WHERE</STRONG> acct_no = acct_id;<BR><BR> new_balance := old_balance - amount;<BR><BR> <STRONG>IF</STRONG> new_balance < 0 <STRONG>THEN</STRONG><BR> <STRONG>RAISE</STRONG> overdrawn;<BR> <STRONG>ELSE</STRONG><BR> <STRONG>UPDATE</STRONG> accts<BR> <STRONG>SET</STRONG> bal = new_balance<BR> <STRONG>WHERE</STRONG> acct_no = acct_id;<BR> <STRONG>END</STRONG> <STRONG>IF</STRONG>;<BR><STRONG>EXCEPTION</STRONG><BR> <STRONG>WHEN</STRONG> overdrawn <STRONG>THEN</STRONG><BR> ...<BR><STRONG>END</STRONG> debit_account;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>在被调用时,这个过程接受一个银行账号和借贷金额。它使用账号从accts表中查询账目结算信息。然后用借款金额计算新的账目结算。如果计算后的余额比零小,异常就会被抛出;否则,该账号相关信息就会被更新。
</P>
<P class=title1>二、子程序的优点</P>
<P>子程序能提供扩展性,它能够让我们根据自己的需求来编写特定的PL/SQL。比如,我们需要一个能够创建新部门的过程,就可以像下面这样编写代码:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>PROCEDURE</STRONG> create_dept(new_dname <STRONG>VARCHAR2</STRONG>, new_loc <STRONG>VARCHAR2</STRONG>) <STRONG>IS</STRONG><BR><STRONG>BEGIN</STRONG><BR> <STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> dept<BR> <STRONG>VALUES</STRONG> (deptno_seq.<STRONG>NEXTVAL</STRONG>, new_dname, new_loc);<BR><STRONG>END</STRONG> create_dept;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>子程序还能提供模块化,就是说它可以把一个程序定义成多个模块,更易管理。这样,我们就可以用自顶而下的设计(top-down
design)和逐步求精(stepwise refinement)的方法来解决问题。</P>
<P>此外,子程序在提高程序的重用性和可维护方面也是很有用的。只要编译成功,子程序就可以放心地用在很多应用程序中。如果它的定义内容发生了改变,受到影响的只有子程序本身而已,这就简化了维护过程。最后,子程序还有助于逻辑的抽象。使用子程序时,我们需要知道的是它们的功能,而不是它们实现功能的细节问题。
</P>
<P class=title1>三、理解PL/SQL过程</P>
<P>过程是一个能执行某个特定操作的子程序。我们可以用下面的语法来编写过程: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>[<STRONG>CREATE</STRONG> [<STRONG>OR</STRONG> REPLACE]]<BR><STRONG>PROCEDURE</STRONG> procedure_name[(parameter[, parameter]...)]<BR> [<STRONG>AUTHID</STRONG> {DEFINER | CURRENT_USER}] {<STRONG>IS</STRONG> | <STRONG>AS</STRONG>}<BR> [<STRONG>PRAGMA</STRONG> AUTONOMOUS_TRANSACTION;]<BR> [local declarations]<BR><STRONG>BEGIN</STRONG><BR> executable statements<BR>[<STRONG>EXCEPTION</STRONG><BR> exception handlers]<BR><STRONG>END</STRONG> [name];
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>parameter的含义如下: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>parameter_name [<STRONG>IN</STRONG> | <STRONG>OUT</STRONG> [<STRONG>NOCOPY</STRONG>] | <STRONG>IN</STRONG> <STRONG>OUT</STRONG> [<STRONG>NOCOPY</STRONG>]] datatype<BR>[{:= | <STRONG>DEFAULT</STRONG>} expression]
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>CREATE子句能让我们创建保存在数据库中的独立过程。我们可以从SQL*Plus中或是在使用动态SQL的程序中执行CREATE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -