IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sql*Plus Oracle Discussion :

[Oracle 8i] Pause à l'exécution d'une proc stockée sous sqlplus


Sujet :

Sql*Plus Oracle

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    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

  2. #2
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Bonjour
    Pourquoi ne pas découper les steps de ton bloc en plusieurs bloc PL/SQL et entre mettre un bloc pause

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    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.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Entrée limitée à 1 caractères
    test2
     
    Procédure PL/SQL terminée avec succès.

  6. #6
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    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 : 165
    Points
    165
    Par défaut
    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

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    @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

  9. #9
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    [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

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2014, 11h17
  2. Exécution d'une procédure stockée sous sql server 2000
    Par amirad dans le forum Développement
    Réponses: 2
    Dernier message: 27/04/2009, 09h50
  3. Exécution d'une proc stock sans ramener les données
    Par Yomen dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/04/2008, 23h11
  4. [SqlServer2000] Problème de temps d'exécution d'une proc stock
    Par GuillaumeBibaut dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/11/2006, 14h31
  5. Réponses: 7
    Dernier message: 10/02/2005, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo