Where DBAs and data experts come together to stop operating and start innovating. Connect, share, and shape the AI era with us.
#Data
Posted by: Serge Rielau
In this post I want to introduce a handy procedure which can be used to suspend a session for a specified amount of time. A naive approach to wait is to simply execute a tight loop in a stored procedure such as this:
--#SET TERMINATOR @CREATE OR REPLACE PROCEDURE SLEEP(seconds INTEGER) BEGIN DECLARE end TIMESTAMP; SET end = CURRENT TIMESTAMP + seconds SECONDS;wait: LOOP IF CURRENT TIMESTAMP >= end THEN LEAVE wait; END IF; END LOOP wait;END@--#SET TERMINATOR ;VALUES CURRENT TIMESTAMP;1--------------------------2012-01-14-13.30.24.593000 1 record(s) selected.CALL SLEEP(5); Return Status = 0VALUES CURRENT TIMESTAMP;1--------------------------2012-01-14-13.30.29.609000 1 record(s) selected.
#define win#ifdef win #include <windows.h>#else #include <unistd.h>#endif#include <sqludf.h>#include <sqlca.h>/************************************************************************** function sleep: Sleep for at least seconds** inputs : seconds to sleep **************************************************************************/#ifdef __cplusplusextern "C"#endif SQL_API_RC SQL_API_FN sleep_sec( SQLUDF_INTEGER *sec, SQLUDF_SMALLINT *secNullInd, SQLUDF_TRAIL_ARGS){ if (*secNullInd != -1 && sec > 0) {#ifdef win Sleep(*sec * 1000);#else sleep(*sec);#endif } return (0);}
LIBRARY SLEEPEXPORTSsleep_sec
sleep_sec
db2 -tCONNECT TO <dbname>;CREATE OR REPLACE PROCEDURE SLEEP(SECONDS INTEGER) SPECIFIC SLEEP NO SQL DETERMINISTIC NO EXTERNAL ACTION FENCED EXTERNAL NAME 'sleep!sleep_sec' LANGUAGE C PARAMETER STYLE SQL;
VALUES CURRENT TIMESTAMP;1--------------------------2012-01-14-13.56.31.671000 1 record(s) selected.CALL SLEEP(5); Return Status = 0VALUES CURRENT TIMESTAMP;1--------------------------2012-01-14-13.56.36.687000 1 record(s) selected.
CREATE OR REPLACE MODULE DBMS_LOCK; ALTER MODULE DBMS_LOCK PUBLISH PROCEDURE SLEEP(seconds INTEGER) SPECIFIC SLEEP NO SQL DETERMINISTIC NO EXTERNAL ACTION FENCED EXTERNAL NAME 'sleep!sleep_sec' LANGUAGE C PARAMETER STYLE SQL;