﻿<?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博客-Winter-随笔分类-数据库</title><link>http://www.cnitblog.com/Winter/category/4123.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 02 Oct 2011 02:08:30 GMT</lastBuildDate><pubDate>Sun, 02 Oct 2011 02:08:30 GMT</pubDate><ttl>60</ttl><item><title>建立存储过程和函数</title><link>http://www.cnitblog.com/Winter/archive/2006/11/07/18917.html</link><dc:creator>winter</dc:creator><author>winter</author><pubDate>Tue, 07 Nov 2006 03:18:00 GMT</pubDate><guid>http://www.cnitblog.com/Winter/archive/2006/11/07/18917.html</guid><wfw:comment>http://www.cnitblog.com/Winter/comments/18917.html</wfw:comment><comments>http://www.cnitblog.com/Winter/archive/2006/11/07/18917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/Winter/comments/commentRss/18917.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/Winter/services/trackbacks/18917.html</trackback:ping><description><![CDATA[建立存储过程或函数<br />存储过程或函数是存储ORACLE数据库中的PL/SQL程序，可由用户直接或间接调用。使用存储过程和函数主要优越性是:<br />1、提高了效:在客户/服务器体系结构中，客户机应用向数据库服务器提出对SQL的需求。随着用户数量的增加，SQL 请求也就不断地增加，使网络很快就成为运行的瓶颈。使用存储过程可使运行性能得到显著的改进，因为对储过程的一个调用，即调用了在服务器中执行的多个SQL语句，从而减少了网络的拥挤。<br />2、可重用性:一个PL/SQL程序只需编写一次，即可用于各种地方.<br />3、可移植性：可在任何ORACLE数据库中使用存储过程，而不用考虑平台问题。<br />4、可维护性:一个存储过程用于完成一个特定的任务，如数据库触发器等需要调用该过程的地方均调用同一个存储过程，这样可降低软件维护的成本。<br />一、 存储过程<br />1、 建立存储过程的语法。<br />CREATE [OR REPLACE] PROCEDURE 程储过程名<br />[（参数1,……参加n）] IS<br />[局部变量声明部分]<br />BEGIN<br />可执行部分<br />[例外处理部分]<br />END;<br />说明：OR REPLACE 选项是当此存储过程存在时覆盖此程储过程。<br />参数部分和过程定义的语法相同。<br /><br />例:定义一个存储过程用于删除students表中按学号指定的学生记录。<br />CREATE OR REPLACE PROCEDURE DELE<br />(STUID VARCHAR2) IS<br />BEGIN<br />DELETE FROM STUDENTS <br />WHERE STU_ID =STUID;<br />END;<br /><br />2、 调用存储过程<br />方法: EXECUTE 存储过程名(参数1,参数n);<br />说明:参数1到参数n的类型与存储过程定义的类型必须一致，且参数的个数必须相同。<br /><br />例:调用DELE存储过程删除学号为1的学生记录。<br />EXECUTE DELE(‘1’);<br /><br />例:建立一个存储过程，在emp表中给按雇员号指定的人员增加工资,如果工资大于2000则增加50，否则如果工资大于1000则增加100，否则增加150。<br />CREATE OR REPLACE PROCEDURE ADDSAL<br />(EMPLOYNO EMP.EMPNO%TYPE) IS<br />INCREMENT NUMBER;<br />SALARY EMP.SAL%TYPE;<br />BEGIN<br />SELECT SAL INTO SALARY FROM EMP <br />WHERE EMPNO=EMPLOYNO;<br />IF SALARY&gt;=2000 THEN<br />INCREMENT:=50;<br />ELSIF SALARY&gt;=1000 THEN<br />INCREMENT:=100;<br />ELSE<br />INCREMENT:=150;<br />END IF;<br />UPDATE EMP<br />SET SAL=SAL+INCREMENT<br />WHERE EMPNO=EMPLOYNO;<br />END;<br /><br />调用此存储过程,给雇员号为7369的记录增加相应的工资。<br />Execute addsal(‘7369’);<br /><br />二、 存储函数<br />1、 语法<br />CREATE [OR REPLACE] FUNCTION 函数名<br />[参数1,……参数n]<br />RETURN 函数数据类型 IS<br />[ 局部变量说明]<br />BEGIN<br />可执行部分<br />[例外处理部分]<br />RETURN 函数的值<br />END;<br />说明:函数数据类型是函数返回值的数据类型；<br />函数的值是返回给调用程序的数值。<br /><br />例：建立一个存储函数，统计指定部门的人数。<br />CREATE OR REPLACE FUNCTION COUNTNUM (DEPNO NUMBER) RETURN NUMBER IS<br />SUMA NUMBER;<br />BEGIN<br />SELECT COUNT(*) INTO SUMA FROM EMP WHERE DEPTNO=DEPNO<br />RETURN SUMA;<br />END;<br /><br />调用此函数时注意不能把函数单独的写成一行。可写在PL/SQL赋值语句的右端。或写在SELECT语句中等等。<br />例：写一PL/SQL块统计10号部门和30号部门人数之和。<br />Declare <br />A number;<br />Begin<br />A:=countnum(10)+countnum(30);<br />Dbms_output.put_line(a);<br />End;<br /><br />例：建立一个存储过程，将STUDENTS表中按学号指定的学生记录移至HISTORY表中。并在history表中增加移入日期 (删除STUDENTS表中的记录，同时录入到HISTORY表中)。<br />Create or replace procedure move( stuno varchar) is<br />Begin<br />/*将students中学号为stuno的记录插入到history表中*/<br />Insert into history(stu_id,name,sex,ldate) <br />select stu_id,name,sex ,sysdate from students<br />where stu_id=stuno;<br />/*将students中学号为stuno的记录删除*/<br />delete from students<br />where stu_id=stuno;<br />end; <br /><br />调用此存储过程，将学号为1的记录移入历史表<br />execute move(‘1’);<br /><br />例:编写一存储函数,将华氏温度转换成摄氏温度。<br />Create or replace function degf_to_degC(deg_f in number)<br />Return number is<br />Deg_c number;<br />Begin<br />Deg_c:=(5.0/9.0)*(deg_f-32);<br />Return deg_c;<br />End;<br />调用此函数，将PATIENT表中的body_temp以摄氏温度显示。<br />Select patient_id, degf_to_degc(body_temp) from patient;<br /><br />在建立存储过程或存储函数时获取错误信息的方法。<br />SHOW ERROR<br /><br />检索存储过程<br />可以从数据字典视图user_source中查得。<br />如查看当前用户模式下的存储过程和函数<br />select name,type from user_source;<br />查看一个具体的存储过程定义。例如查看move的定义可以用：<br />select text from user_source where name=’MOVE’;<!-- / message --><img src ="http://www.cnitblog.com/Winter/aggbug/18917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/Winter/" target="_blank">winter</a> 2006-11-07 11:18 <a href="http://www.cnitblog.com/Winter/archive/2006/11/07/18917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>