|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Bonjour.
J'ai une procédure stockée proc.sql que je lance sous SqlPlus. J'aimerais qu'elle fasse une pause pendant l'exécution, continuée par l'appui d'une touche (ou autre). J'ai pensé à ACCEPT mais cela ne rentre pas dans un bloc PL/SQL. Une idée? (si c'est réalisable) Merci |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() Inscription : septembre 2003 Messages : 432 ![]() |
Je ne sais pas comment rendre un pl/sql interactif à ma connaissance c'est impossible.
Cependant tu peux jouer avec un flag. proc.sql: f_ret_falg retourne une valeur stocké dans une table par exemple. Sinon tu peux donner un temps d'attente et faire un boucle aussi. |
|
|
00
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : septembre 2006 Messages : 17 ![]() |
Bonjour
Pourquoi ne pas découper les steps de ton bloc en plusieurs bloc PL/SQL et entre mettre un bloc pause |
|
|
00
|
|
|
#4 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
Le but est de déboguer une proc qui tourne sans fin, en affichant les messages au fur et à mesure (donc en vidant le buffer au fur et à mesure), et de suivre le moment où la boucle se perd.
J'ai utilisé une méthode un peu lourde: j'insère des commentaires dans une table en faisant un commit après chaque insertion. Efficace mais oblige à alourdir le code momentanément. Du coup, j'ai 3 questions: 1) Comment vider le buffer instantanément, c'est-à-dire afficher un dbms_output.put_line dès qu'on le rencontre? 2) sygale, comment donnes-tu un temps d'attente? 3) free people, tu peux m'expliquer ton point de vue? Merci. |
|
|
00
|
|
|
#5 | ||||||
|
Futur Membre du Club
![]() Inscription : septembre 2006 Messages : 17 ![]() |
Ta procédure execute deux steps : steps1 et steps2
tu veux faire une pause entre ces deux blocs tu divise ces deux blocs entre deux proc et tu fais un pause entre le pause arrête l'execution de quelque chose jusqu' a ce que tu tapes sur une touches mon script test.sql Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#6 | ||||
|
Membre éclairé
![]() Inscription : septembre 2003 Messages : 432 ![]() |
Citation:
Citation:
Code :
|
||||
|
|
00
|
|
|
#7 |
|
Membre actif
![]() Inscription : avril 2006 Messages : 133 ![]() |
Petite suggestion :
Pour pouvoir tracer en temps reel l'execution de vos programes, vous pouvez utiliser le package : DBMS_APPLICATION_INFO. Exemple de ce que vous pouvez inserer dans le code PL: /* Debut de programme */ DBMS_APPLICATION_INFO.SET_MODULE('Mon prog','Initialisation'); .... /* en cours de traitement */ DBMS_APPLICATION_INFO.SET_ACTION('je suis au niveau XXX de ma boucle'); ==> Une fois le programme lancé, il suffit de reperer votre session (ou s'execute le PL) : pour cela vous avez la vue v$session , il ne reste plus qu'à selectionner régulierement les champs renseignés par DBMS_APPLICATION_INFO : ACTION CLIENT_INFO MODULE .... On peut aussi determiner avec SET_SESSION_LONGOPS le niveau et le temps d'attente moyen en cours de traitement .... Bon courage |
|
|
00
|
|
|
#8 |
|
Membre éprouvé
![]() Inscription : septembre 2004 Messages : 465 ![]() |
@free people: merci, mais ça ne m'arrange pas du tout, j'ai des curseurs, découpage impossible
@sygale: utl_file, si je peux éviter... ton exemple a l'air pas mal, sauf que pendant cette attente je ne suis pas sûr de voir mes messages... à essayer @jlucch: je cours zyeuter ce package, très intéressant merci à tous les 3 |
|
|
00
|
|
|
#9 |
|
Membre éclairé
![]() Inscription : septembre 2003 Messages : 432 ![]() |
[QUOTE=GoLDoZ@sygale: utl_file, si je peux éviter...
ton exemple a l'air pas mal, sauf que pendant cette attente je ne suis pas sûr de voir mes messages... à essayer Tu ne verras pas les messages, les dbms_output sont lisibles qu'apres l'exécution total de la proc, si tu veux toutes les traces au fur et à mesure utl_file si tu souhaites la dernière DBMS_APPLICATION_INFO |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Pour faire une pause je te conseillerais plutot d'utiliser le package DMBS_ALERT c'est pas à proprement parler fait pour ça, mais il introduit une notion de timeout qui peut te servir de pause, ce sera plus simple et surtout beaucoup plus propre qu'une boucle infinie (ça évitera entre autres d'écrouler la CPU de la machine...)
http://download-west.oracle.com/docs...ale.htm#999107 Le principe est que tu te mets en attente d'une alerte nomée qui ne vient jamais mais tu défini un timeout au bout duquel la procédure rend la main Code :
Je ne connaissait pas DBMS_APPLICATION_INFO, ça a l'air trés sympa aussi... |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com