PLSQL是基于Oracle的一个主流应用程序编程语言.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:6 大小:49KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

PLSQL是基于Oracle的一个主流应用程序编程语言.doc

PLSQL是基于Oracle的一个主流应用程序编程语言.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

你的考试好帮手,记住我们的网址:www.zuowenw.com.快乐阅读网你的考试好帮手,记住我们的网址:www.zuowenw.com.快乐阅读网PL/SQL是基于Oracle的一个主流应用程序编程语言,它的主要特点是将SQL语句与过程化程序开发语言相结合,以实现更为复杂的商业逻辑。本文主要就其中多进程通信进行讨论。显然,多进程技术是用来提高应用的并发性,进而提高整个系统的执行效率,那么如何在PL/SQL中实现多进程的通信呢?其实,PL/SQL其设计的初衷主要是增强SQL语句的功能,而没有考虑到其他编程语言的高级功能,所以在PL/SQL中实现多进程通信只能借助于Oracle提供的两个开发包:DBMS_PIPE和DBMS_ALERT.1.DBMS_PIPE该包提供多进程之间管道通信的方法,比如连接到同一个数据库的两个独立会话之间可以通过管道进行通信,另外也可以在存储过程和Pro*C之间进行通信,这样就大大地增强了PL/SQL的处理能力。该包主要提供两对函数:pack_message(v_msgvarchar2)——将v_msg信息打包放入到缓冲器中,准备发送;send_message(v_pipenamevarchar2)——发送名为v_pipename的管道的缓冲器;unpack_message(v_msgvarchar2)——将信息解析到v_msg中;receive_message(v_pipenamevarchar2)——接受名为v_pipename的管道的缓冲器;其执行的原理是:首先建立有名管道(这点熟悉unix很清楚),管道的发送端和接受端都有相应的缓冲器进行接受和发送处理,要注意的是,文本信息必须打包来发送,通过解析来读取信息。为了理解前面的描述,下面列举一个两个会话之间通信的实例。发送进程:declarev_pipenamevarchar2(30):='pipe1';v_statusinteger;begindbms_pipe.pack_message('hello,thisissendingprocess!');v_status:=dbms_pipe.send_message(v_pipename);ifv_status!=0thendbms_output.put_line('error!');endif;end;/接受进程:declarev_pipenamevarchar2(30):='pipe1';v_statusinteger;v_msgvarchar2(20);beginv_status:=dbms_pipe.receive_message(v_pipename);ifv_status!=0thendbms_output.put_line('error');endif;dbms_pipe.unpack_message(v_msg);dbms_output.put_line(v_msg);end;/2.DBMS_ALERT与DBMS_PIPE类似,DBMS_ALERT可以实现多个进程(会话)之间的通信。其基本的执行过程为:首先建立一个报警通道,然后通过报警通道来发送报警信号;在接收端需要先注册该报警通道,对该通道进行监听,然后等待报警信号的到来。下面是该包中的主要函数说明:dbms_alert.signal(报警管道名,待发送消息)——发送报警信息;dbms_alert.reGISter(报警管道名)——注册报警管道;dbms_alert.waitone(报警管道名,接受消息值,返回状态值)——对报警管道进行监听,等待消息的到来;同样,这里也给出使用DBMS_ALERT的一个实例。发送进程:declarev_alertNamevarchar2(30):='alert1';begindbms_alert.signal(v_alertName,'hello,thisissendingprocess!');commit;end;/接受进程:declarev_alertNamevarchar2(30):='alert1';v_statusinteger;v_msgvarchar2(20);begindbms_alert.register(v_alertName);dbms_alert.waitone(v_alertName,v_msg,v_status);ifv_status!=0thendbms_output.put_line('error');endif;dbms_output.put_line(v_msg);end;/3.说明DBMS_PIPE和DBMS_ALERT这两个包都可以进行多进程间的通信,但两者任然是有一些区别:(1)报警信号是同步的。报警信号直到会话发出Commit时才被发出;如果它