Je dois écrire une procédure qui enregistre l'heure d'exécution de toute instruction SQL dans une table.
La procédure appelle par Mon idée est comme ceci: p> mais cela n'a pas fonctionné pour moi pour un est un moyen d'exécuter des comptations SQL dans une procédure? P> P> EXEC Mesureqltime ("État SQL en chaîne '); CODE> P>
SELECT * ... code> Clause. (Je pense que SQL Besoin d'une commande dans la commande) p>
4 Réponses :
Si votre instruction SQL est une sélection, vous devez extraire du curseur pour avoir une mesure significative de son temps d'exécution.
Si vous n'agissez pas du curseur, vous ne mesurez que le temps passé dans les phases "analyses" et "exécution", alors que la plupart des travaux sont généralement effectués dans la phase "Fetch" pour sélectionner des déclarations. P >
Vous ne pourrez pas récupérer avec Voici un exemple: p> Notez que cela mesurera le temps nécessaire chercher à la dernière ligne du SELECT. P> P> exécuter immédiatement code> ou
Ouvrir le curseur pour "chaîne" code> Si vous ne connaissez pas le nombre de colonnes, l'instruction réelle sera ont. Vous devrez utiliser le package SQL dynamique
dbms_sql code> < / a> si le nombre / type de colonnes de la sélection est inconnu. p>
Hé, ça a fière allure :) Mais cela ne fonctionne que pour sélectionner des déclarations, n'est-ce pas? Existe-t-il une option o Exécuter Supprimer ou insérer des déclarations?
@Sheepy: Vous ne pouvez pas récupérer un curseur DML (insertion / mise à jour ...) afin que la ligne 12 augmente une erreur dans ce cas. Attrapez l'exception et la procédure fonctionnera pour les DML et sélectionnera les requêtes.
dbms_utility.get_time ne peut pas être approuvé et vous devez utiliser SystêmeStamp à la place, voir asktom.oracle.com/pls/asktom/...
@Superdooperhero Ce n'est pas ce que Tom Kyte suggère du tout! Il suggère de remplacer sysdate code> avec
systemestamp code> pour avoir une plus grande précision. Il utilise toujours
dbms_utility.get_time code>
Pour calculer la durée d'un temps d'exécution
PROCEDURE MY_PROCEDURE IS timeStart TIMESTAMP; timeEnd TIMESTAMP; BEGIN timeStart := SYSTIMESTAMP; -- YOUR CODE HERE timeEnd := SYSTIMESTAMP; INSERT INTO PROC_RUNTIMES (PROC_NAME, START_TIME, END_TIME) VALUES ('MY_PROCEDURE ', timeStart , timeEnd ); END MY_PROC;
Compléter Devosjava répondit ... Évitez d'l'utiliser à Dawn; P
PROCEDURE MY_PROCEDURE IS timeStart TIMESTAMP; timeEnd TIMESTAMP; timeSecond NUMBER BEGIN timeStart := SYSTIMESTAMP; -- YOUR CODE HERE timeEnd := SYSTIMESTAMP; timeSecond :=((extract(hour from timeEnd)*3600)+(extract(minute from timeEnd)*60)+extract(second from timeEnd))-((extract(hour from timeStart)*3600)+(extract(minute from timeStart)*60)+extract(second from timeStart)); dbms_output.put_line('finished: '||timeSecond||' seconds'); END MY_PROC;
Timesecond: = extrait (deuxième de Timeend - TimeStart); Code>
Insérer dans proc_runtimes (proc_Name, start_time, fin_time) Valeurs ('PROC_NAME', TO_CHAR (Sysdate, 'jj / mm / aaaa HH24: MI: SS'), NULL); P>
votre requête ici; p>
Insérer dans proc_runtimes (proc_Name, start_time, fin_time) Valeurs ('PROC_NAME', NULL, TO_CHAR (Sysdate, 'jj / mm / yyyy HH24: MI: SS')); P>