您现在的位置是:首页
>
存储过程的创建 后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子
后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子 egi max ro为提交主存储过程起动的程序 max ro 为主存储过程 readmax ro 为主存佳话 使用ORACL
后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子

beginmaxpro为提交主存储过程起动的程序 maxpro 为主存储过程 readmaxpro 为主存佳话 使用ORACLE中的DBMS_PIPE管道能力 注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以 在sqlpus用设定 set serveroutput ON 进行测试 通过 @testmaxpro sql 创始程序包 测试过程如下 SQL> call beginmaxpro(); JOB= 调用完成 SQL> call readmaxpro(); maxpro 的当前进行状态为 调用完成 SQL> */ 建立状态表 create table mytest(mystatus integer); delete from mytest; INSERT INTO MYTEST(MYSTATUS) VALUES( ); mit; / 不可重用的存储过程 并且处理过程通过管道给ORACEL内的存储过程通信 使用ORACLE中的DBMS_PIPE管道能力 注意要明文给于用户 EXECUTE ANY PROCEDURE 权力才可以 首先 create table mytest(mystatus integer); INSERT INTO MYTEST(MYSTATUS) VALUES( ); CREATE OR REPLACE PROCEDURE maxpro(P_NEXTDATE IN OUT DATE) AS CREATE OR REPLACE PROCEDURE maxpro AS n integer; status NUMBER; BEGIN 取当前状态 SELECT mystatus INTO N FROM MYTEST; DBMS_OUTPUT PUT_LINE( n= || n); IF N= THEN DBMS_OUTPUT PUT_LINE( 过程不可重入 ); RETURN; END IF; 过程调用lock UPDATE MYTEST SET MYSTATUS= ; MIT; 通过DBMS_LOCK SLEEP( ); 模拟大的处理过程 过程处理一段时间后就将一些信息放入管道 FOR N IN LOOP DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE(N); 把信息放入缓冲区 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); 信息放入管道mypipe 系统等待时间为 秒 最大长度 DBMS_LOCK SLEEP( ); END LOOP; 过程调用unlock DBMS_PIPE PURGE( maxpro ); 清除原管道信息 DBMS_PIPE PACK_MESSAGE( ); 把信息放入缓冲区 表示过程完成 信息放入管道mypipe 系统等待时间为 秒 最大长度 原长度为 现在设为 是担心长度不足出错 status:=DBMS_PIPE SEND_MESSAGE( maxpro ); UPDATE MYTEST SET MYSTATUS= ; DBMS_OUTPUT PUT_LINE( 过程处理完成 ); MIT; P_NEXTDATE:=NULL; END maxpro; / CREATE OR REPLACE PROCEDURE readmaxpro AS n integer; status integer; begin 接受等待时间为 秒 可以为 立即调用或DBMS_PIPE RECEIVE_MESSAGE( mypipe ) 等待 天 status:= DBMS_PIPE RECEIVE_MESSAGE( maxpro ); status为 为成功可以UNPACK_MESSAGE 为超时没有数据 为信息太大 为内部错误 IF status <> THEN SELECT mystatus INTO N FROM MYTEST; IF N= THEN DBMS_OUTPUT PUT_LINE( maxpro 过程没有起动 ); ELSE DBMS_OUTPUT PUT_LINE( maxpro 过程起动 但管道中现在没有信息返回 ); END IF; return; END IF; DBMS_PIPE UNPACK_MESSAGE(n); DBMS_OUTPUT PUT_LINE( maxpro 的当前进行状态为 || n); end; 起动maxpro为后台进程的存储过程 / CREATE OR REPLACE PROCEDURE beginmaxpro AS JOB BINARY_INTEGER; BEGIN DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) TRUE); DBMS_JOB SUBMIT(JOB maxpro; sysdate sysdate+( /( * * )) ); 提交做业 秒后执行 注意设定实例ini文件中的job_queue_interval = DBMS_JOB SUBMIT(JOB maxpro; sysdate NULL FALSE); DBMS_JOB SUBMIT(JOB maxpro; sysdate+( /( * * )) NULL FALSE); DBMS_OUTPUT PUT_LINE( JOB= || JOB); MIT; end; / lishixinzhi/Article/program/Oracle/201311/16828
很赞哦! (1053)