Implémentation de la fonctionnalité de veille dans ORACLE sans DBMS_LOCK
Retarder manuellement l'exécution d'une requête SQL dans ORACLE peut devenir une exigence dans certains scénarios. Cependant, s'appuyer sur la fonction DBMS_LOCK.sleep nécessite souvent d'accorder des privilèges à l'utilisateur exécutant la procédure. Pour contourner cela, une approche alternative peut être utilisée.
La fonction fournie, MYSCHEMA.TEST_SLEEP, utilise DBMS_LOCK.sleep pour suspendre l'exécution pendant un nombre de secondes spécifié. Cependant, cela nécessite d'accorder le privilège DBMS_LOCK au propriétaire de la procédure. Pour éviter cela, l'extrait de code suivant propose une méthode alternative :
CREATE OR REPLACE FUNCTION MYSCHEMA.ALTERNATIVE_SLEEP ( TIME_ IN NUMBER ) RETURN INTEGER IS IN_TIME INT; -- seconds to sleep v_now DATE; -- current date and time BEGIN SELECT SYSDATE -- Get the current date and time INTO v_now FROM DUAL; LOOP -- Sleep until the specified time has elapsed EXIT WHEN v_now + (IN_TIME * (1/86400)) <= SYSDATE; -- Break from the loop when the target time is reached END LOOP; RETURN 1; -- Dummy return value to avoid syntax errors EXCEPTION WHEN OTHERS THEN RAISE; RETURN 1; -- Dummy return value to avoid syntax errors END ALTERNATIVE_SLEEP;
Cette fonction exploite une boucle pour simuler la fonctionnalité de veille sans utiliser le package DBMS_LOCK. Il vérifie périodiquement la date et l'heure actuelles pour déterminer si la durée de sommeil spécifiée est écoulée. Lorsque l'heure cible est atteinte, la boucle se termine. Cette approche suspend effectivement l'exécution de la procédure pendant la durée souhaitée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!