您现在的位置是:首页 >

存储过程的创建 后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子

火烧 2023-01-09 23:36:20 1053
后台运行一个主存储过程,主存储过程通过管道同前端过程通信的例子    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  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码