要想利用pl/sql程序完成比较完整的数据库任务,需要进一步学习一些高级设计要素的内容。前面编写执行的pl/sql程序,共同的特点是没有名称,只能存储为文件,然后通过执行文件的方式执行,因此称为无名块。与此对应的是在pl/sql中也引入了高级程序设计的一些概念,其中最重要的就是过程。
过程就是高级程序设计语言中的模块的概念,将一些内部联系的命令组成一个个过程,通过参数在过程之间传递数据是模块化设计思想的重要内容。
创建过程
1. 过程的语法结构
完整的过程结构如下:
create or replace procedure 过程名 as
声明语句段;
begin
执行语句段;
exception
异常处理语句段;
end;
2. 过程的特点
过程是有名称的程序块,as关键词代替了无名块的declare。
3. 创建过程实例
在【sqlplus worksheet】中执行下列pl/sql程序,该程序将创建名为tempprocedure的过程,create是创建过程的标识符,replace表示若同名过程存在将覆盖原过程。该过程定义了一个变量,其类型和testtable数据表中的currentdate字段类型相同,都是日期型,将数据表中的recordnumber字段为88的currentdate字段内容送入变量中,然后输出结果。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
create or replace procedure tempuser.tempprocedure as
tempdate tempuser.testtable.currentdate%type;
begin
select currentdate
into tempdate
from testtable
where recordnumber=88;
dbms_output.put_line(to_char(tempdate));
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章\ createprocedure.sql。
执行结果如图9.41所示。
查询过程
登录【企业管理器】,在【管理目标导航树】里选择【网络】/【数据库】/【myoracle.m.net】/【方案】/【过程】/【tempuser】选项,出现如图9.42所示的创建好的过程。
修改过程
(1)在【sqlplus worksheet】的【菜单栏】选择【文件】/【打开】菜单命令,将创建过程的createprocedure.sql文件调出进行修改,修改完毕后重新执行创建过程。
(2)在【企业管理器】里选中要修改的过程,用鼠标右键单击,在出现的快捷菜单里选择【查看/编辑详细资料】选项,如图9.43所示。
(3)出现如图9.44所示的编辑过程的【一般信息】选项卡。在【文本编辑区】可以编辑该过程,单击“确定”按钮将更新该过程,单击“编译”按钮将编译该过程的 pl/sql 源代码,使该过程可以在数据库中存储和执行。
执行过程
要执行创建的过程,必须通过主程序来调用过程。
在【sqlplus worksheet】中执行下列pl/sql程序,执行结果如图9.45所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
begin
tempprocedure;
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章\ executeprocedure.sql。
在oracle中,创建好的过程可以被任何程序调用。
带参数的过程
前面介绍的过程没有参数,主程序和过程没有数据的传递,下面介绍带参数的过程的设计和使用。
1. 参数类型
在pl/sql过程中,可以有3种类型的参数。
in参数:读入参数,主程序向过程传递参数值。
out参数:读出参数,过程向主程序传递参数值。
in out 参数:双向参数,过程与主程序双向交流数据。
2. 定义带参数的过程
在下面的pl/sql程序代码中,将创建三个调用参数。
tempdeptno:类型为in,与scott.dept.deptno的类型一致,为数值型。
tempdname:类型为out,与scott.dept.dname的类型一致,为字符型。
temploc:类型为in out,与scott.dept.loc类型一致,为字符型。
创建两个过程内参数。
loc1:与scott.dept.loc的类型一致,为字符型。
dname1:与scott.dept.dname的类型一致,为字符型。
该带参数的过程的功能是从数据表scott.dept中寻找deptno字段等于tempdeptno调用参数值的dname和loc字段,和其他字符组合,送给两个出口参数。
以system用户名、sysdba身份登录【sqlplus worksheet】,执行下列pl/sql程序,执行结果如图9.46所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
create or replace procedure scott.tempprocedure(
tempdeptno in scott.dept.deptno%type,
tempdname out scott.dept.dname%type,
temploc in out scott.dept.loc%type)as
loc1 scott.dept.loc%type;
dname1 scott.dept.dname%type;
begin
select loc into loc1
from scott.dept
where deptno=tempdeptno;
select dname into dname1
from scott.dept
where deptno=tempdeptno;
temploc:='地址:'loc1;
tempdname:='姓名'dname1;
end;
―――――――――――――――――――――――――――――――――――――
【配套程序位置】:第9章\ createscottprocedure.sql。
调用参数分割用“,”号。
3. 使用带参数的过程
在主程序中的实际参数和过程中的形式参数的传递有很多种办法,这里推荐读者采用一一对应的办法,按对应的位置传递参数。要求实际参数和形式参数在数据类型和位置排列上做到完全一致。
在【sqlplus worksheet】中执行下列pl/sql程序,该程序调用带参数的过程scott.tempprocedure,实际参数为(10,’’,’’)
执行结果如图9.47所示。
【配套程序位置】:第9章\ executescottprocedure.sql。
读者可以尝试改变参数值,然后测试过程执行结果。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器