\set ECHO all SELECT pg_sleep(3); /* * DBMS_ALERT is used for one-way communication of one session to other. * * This session mainly sends signals for testing the alert functionality in * session B and C. * * The following alerts are used to ensure that signals are sent at correct * times to session B for testing. These signals are sent from session B * indicating completion of an event. * After the signal is received, the next required signal for testing is sent * from this session. */ SELECT dbms_alert.register('b1'); SELECT dbms_alert.register('b2'); SELECT dbms_alert.register('b3'); SELECT dbms_alert.register('b4'); SELECT dbms_alert.register('b5'); SELECT dbms_alert.signal('a1','Msg1 for a1'); SELECT dbms_alert.signal('a2','Msg1 for a2'); /* * Test: defered_signal * The signal is received only when the signalling transaction commits. * To test this, an explict BEGIN-COMMIT block is used. */ SELECT dbms_alert.signal('tds','Begin defered_signal test'); BEGIN; SELECT dbms_alert.signal('tds','Testing defered_signal'); /* The signal is received while transaction is running */ SELECT dbms_alert.waitone('b1',20); COMMIT; /* The signal is received after transaction completed. * After this the tds signal is received in session B indicating that the * signal is received only after commit. */ SELECT dbms_alert.waitone('b1',20); SELECT dbms_alert.waitone('b2',20); /* This signals a3 which is not registered in Session B */ SELECT dbms_alert.signal('a3','Msg1 for a3'); /* alert a4 is signalled soon after a3 */ SELECT dbms_alert.signal('a4','Test- Register after signal'); /* This signal indicates at remove() is called */ SELECT dbms_alert.waitone('b3',20); /* Send signal which is removed in session B */ SELECT dbms_alert.signal('a1','Msg2 for a1'); SELECT dbms_alert.waitone('b4',20); /* Send signal which is registered in B and not removed */ SELECT dbms_alert.signal('a4','Msg1 for a4'); /* This signal inidcates that removeall() is called */ SELECT dbms_alert.waitone('b5',20); /* Send a signal to test if session B receives it after removeall() */ SELECT dbms_alert.signal('a2','Msg2 for a2'); /* cleanup */ SELECT dbms_alert.removeall();