Salvador Salvador - 7 months ago 53
SQL Question

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?

Thanks in advance.

Answer

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;