我想在一张表的记录发生变化时,通过在出发器里发送一个消息,用dbms_alert.signal 
在收到这个消息时,调用我的存储过程进行一些数据的运算,现在的问题时,我知道在这个表的触发器里我可以写dbms_alert.signal ;但接收消息的dbms_alert.waitone 写在什么地方呢?
有用过的没有

解决方案 »

  1.   

    发送进程:declare
    v_alertName varchar2(30):='alert1';
    begin
    dbms_alert.signal(v_alertName,' hello,this is sending process!');
    commit;
    end;
    /   接受进程:declare
    v_alertName varchar2(30):='alert1';
    v_status integer;
    v_msg varchar2(20);
    begin
    dbms_alert.register(v_alertName);
    dbms_alert.waitone(v_alertName,v_msg,v_status);
    if v_status !=0 then
    dbms_output.put_line('error');
    end if;
    dbms_output.put_line(v_msg);
    end;

      

  2.   

    这段代码我知道,我想知道的是:发送的过程我可以写在我表的触发器里,只要表记录有变化,我就可以发送一个消息,
    但是接收进程这段代码我写在什么地方,才能保证,只要我表里有新记录我就可以立刻收到消息进行处理
    谢谢tgm78 能否再指点一下
      

  3.   

    警报在应用系统中有很大的作用,比如,服务器要关闭,要通知所有的应用客户端保存数据并退出系统,这时可以用到警报罗、、、使用警报的方法很简单,发送者只管往已命名的警报里发信息,接收者只要注册自己感兴趣的警报,然后等待警报的到来就行了。.................1、往命名为test_alert警报器发送警报begin
    dbms_alert.signal('test_alert', 'this is my alert testing'); 
    commit; --必须COMMIT,警报才会真正被发出
    end;2、接收命名为test_alert警报器里的警报declare
    alert_msg varchar2(1000);
    rev_status number;
    begin
    dbms_alert.register('test_alert'); --注册要接收信息的警报器
    dbms_alert.waitone('test_alert', alert_msg, rev_status); --等待警报器test_alert的信息到来,并把接收的信息传给alert_msg变量
    if rev_status = 0 then
    dbms_output.put_line('get alert is :'||alert_msg);
    else
    dbms_output.put_line('get alert timeout!');
    end if;
    end;注意:接收者要接收警报必须执行等待过程,等待警报的到来,否则不会得到任何警报的。用二种方法测试一下:方法一:先执行步骤2,再执行步骤1。这时可以获得警报方法二:先执行步骤1,再执行步骤2。这时不能获得任何警报,执行步骤2的SESSION处于等待状态,当下一时间点再次执行步骤1时,就可以获得警报。警报可以是一对一,也可以是一对多的,即一个警报可以同时被多个接收者接收。
      

  4.   

    在应用程序中调用:
    dbms_alert.register() ---注册命名警告
    dbms_alert.waitone() ---等待警告的激发
    (应用程序在此被阻塞)
    在后台存储过程完成你所需工作后调用:
    dbms_alert.singnal() ---通知警告
    以便通知应用程序,继续你所希望的处理。
      

  5.   

    单独一个进程,在循环执行dbms_alert.wantone或者dbms_alert.waitany,当status为0时进行你说的计算,然后继续循环等待消息...