Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Sql*Plus
Sql*Plus Forum d'entraide sur Oracle Sql*Plus
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2006, 16h08   #1
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
Par défaut [Oracle 8i] Pause à l'exécution d'une proc stockée sous sqlplus

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
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 16h42   #2
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
Je ne sais pas comment rendre un pl/sql interactif à ma connaissance c'est impossible.
Cependant tu peux jouer avec un flag.

proc.sql:
Code :
1
2
3
 
while f_ret_flag=0 loop
end loop;
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.
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 17h10   #3
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 17
Points : 17
Points : 17
Bonjour
Pourquoi ne pas découper les steps de ton bloc en plusieurs bloc PL/SQL et entre mettre un bloc pause
free people est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 17h54   #4
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
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.
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2006, 18h13   #5
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 17
Points : 17
Points : 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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
SET serveroutput ON 
 
begin 
	dbms_output.put_line ('test1') ; 
end ; 
/
 
pause 
 
begin 
	dbms_output.put_line ('test2') ; 
end ; 
/
j'exécute mon script :

Code :
1
2
3
4
SQL> start c:\test.sql 
test1
 
Procédure PL/SQL terminée avec succès.
il attend que je tape sur entrée pour continuer

Code :
1
2
3
4
5
 
Entrée LIMITée à 1 caractères
test2
 
Procédure PL/SQL terminée avec succès.
free people est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 12h15   #6
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
Citation:
Envoyé par GoLDoZ
1) Comment vider le buffer instantanément, c'est-à-dire afficher un dbms_output.put_line dès qu'on le rencontre?
C'est impossible, sinon fait une trace dans un fichier avec la package utl_file, il doit y avoir des exemples déjà posté

Citation:
Envoyé par GoLDoZ
2) sygale, comment donnes-tu un temps d'attente?
Pour un temps d'attente tu peux faire un truc comme ca par exemple
Code :
1
2
3
4
5
6
7
8
9
 
wtemps pls_integer :=15 --tps en minutes'
wdat_fin date;
begin
wdat_fin:=sysdate + (wtemps/24/60);
do while sysdate<wdat_fin loop
--ras'
end loop;
end;
J'ai pas vérifier le code
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 15h08   #7
Membre actif
 
Inscription : avril 2006
Messages : 133
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : avril 2006
Messages : 133
Points : 156
Points : 156
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
jlucch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 16h27   #8
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
@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
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 16h36   #9
Membre éclairé
 
Inscription : septembre 2003
Messages : 432
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 432
Points : 326
Points : 326
[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 [/QUOTE]

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
sygale est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2006, 17h13   #10
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE OR REPLACE PROCEDURE TA_PROCEDURE() IS
....
a_nom varchar2(32);
a_message varchar2(32);
a_status integer;
BEGIN
 a_nom := 'ALERTE_BIDON'; 
 DBMS_ALERT.REGISTER(a_nom);
 ....
 WHILE machin LOOP
  ... 
  -- insertion d'une pause de 5 seconde
  DBMS_ALERT.WAITONE(a_nom, a_message, a_status, 5);
  ...
 END LOOP
...
DBMS_ALERT.REMOVE(a_nom);
END;
Pour ce qui est des la traces, je ne connais pas de moyen de faire "flusher" le dbms_output en cours d'exécution de procédure. Ca aurait été moi, j'aurais soit fait de l'UTL_FILE en n'oubliant pas de faire les flush, soit une procédure AUTONOME qui insère dans une table en faisant un commit à chaque fois.
Je ne connaissait pas DBMS_APPLICATION_INFO, ça a l'air trés sympa aussi...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h54.


 
 
 
 
Partenaires

Hébergement Web