Search code examples
sqloracleplsqloracle11g

Sleep function in ORACLE


I need execute an SQL query in ORACLE it takes a certain amount of time. So I wrote this function:

CREATE OR REPLACE FUNCTION MYSCHEMA.TEST_SLEEP
(
TIME_  IN  NUMBER
)
RETURN INTEGER IS
 BEGIN
   DBMS_LOCK.sleep(seconds => TIME_);
RETURN 1;
 EXCEPTION
   WHEN OTHERS THEN
   RAISE;
   RETURN 1;
END TEST_SLEEP;

and I call in this way

SELECT TEST_SLEEP(10.5) FROM DUAL

but to work I need set grant of DBMS_LOCK to the owner of the procedure.

How I can rewrite this function without using the DBMS_LOCK.sleep function?


Solution

  • Short of granting access to DBMS_LOCK.sleep, this will work but it's a horrible hack:

    IN_TIME INT; --num seconds
    v_now DATE;
    
    -- 1) Get the date & time 
    SELECT SYSDATE 
      INTO v_now
      FROM DUAL;
    
    -- 2) Loop until the original timestamp plus the amount of seconds <= current date
    LOOP
      EXIT WHEN v_now + (IN_TIME * (1/86400)) <= SYSDATE;
    END LOOP;