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

PL/SQL Oracle Discussion :

catcher lorsque le curseur est ferme


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut catcher lorsque le curseur est ferme
    Bonjour,

    j'ai une procedure stockée qui me renvoie un curseur que je traite dans mon code java.

    Le but est de connaitre le temps d'execution de ma requete donc j'aimerais,depuis ma procédure stockée, savoir quand je ferme mon curseur ( quand je fais tcall.close() dans ma classe java) pour avoir le temps avant ouverture du curseur et le temps apres fermeture du curseur

    Procédure stockée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    PROCEDURE recherchesanspage (
          w_refcursor         IN OUT   refcursor,...)
    IS
          requetefinale   VARCHAR2 (15000);
    BEGIN
    .......
    OPEN w_refcursor FOR requetefinale;
    END;
    Dans ma classe Java

    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
    OracleCallableStatement tCall = (OracleCallableStatement)connection.prepareCall(recherchesanspage(monCurseur));
    tCall.execute();
    ResultSet rs = tCall.getCursor(1);
    while (rs.next()) {
    .....
    }
    finally {
        try {
              rs.close();
              tCall.close();
           }
        catch (Throwable throwable) {
             getLogger().error(throwable.getMessage(), throwable);
         }
    }
    Merci

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Il n'est possible de savoir quand le curseur est fermé via java. Mais pour connaître « le temps d'exécution » vous pouvez instrumenter votre code java.

  3. #3
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Le curseur est fermé lorsque vous sortez du while (rs.next), sinon comment pourriez-vous en extraire les lignes ?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Il ne faut pas que je touche au code java et c'est bien la ma difficulté. Il aurait été assez simple de recuperer le temps d'execution de ma requete dans le code java mais je dois le faire dans la procédure stockée. Et je ne sais pas du tout comment faire, je ne sais même pas si c'est possible de le faire puisque je recupere et traite mon curseur, récupéré par ma procédure stockée, depuis mon code java.

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Comment voulez-vous récupérer ce temps dans le code Java si vous ne pouvez y toucher ?

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    J'ai pas dit que je voulais récupérer le temps d'execution dans mon code java, justement je ne veux pas toucher au code java. Je souhaite récupérer le temps d'execution dans mon code sql de ma procédure stockée

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    oui, mais qu'en ferez-vous dans le code SQL ? l'afficher ? le stocker dans une table ?
    pouvez-vous détailler d'avantage

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par mikees Voir le message
    J'ai pas dit que je voulais récupérer le temps d'execution dans mon code java, justement je ne veux pas toucher au code java. Je souhaite récupérer le temps d'execution dans mon code sql de ma procédure stockée
    Faite une trace SQL ou instrumentez votre procédure SQL

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    oui, mais qu'en ferez-vous dans le code SQL ? l'afficher ? le stocker dans une table ?
    pouvez-vous détailler d'avantage

    Je souhaite effectivement stocker le temps d'execution de ma requete dans une table.

    Citation Envoyé par mnitu Voir le message
    Faite une trace SQL ou instrumentez votre procédure SQL
    Je ne suis pas vraiment calé en sgbd oracle, tu pourrais détailler un peu plus comment je peux faire ? merci

  10. #10
    Membre éprouvé
    Inscrit en
    Février 2009
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 127
    Par défaut
    Bonjour,

    A mon avis, tu n'as pas le choix.
    Il faut faire cela dans Java.
    Une foix le curseur ouvert tu ne repasses pas par ta procédure je pense ...

    De toute facon tu peux mettre une trace en début et en fin de procédure et voir si ça s'affiche avant le retour dans java ou après.

  11. #11
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Si vous pouvez modifier le code PL/SQL du coté de la base, alors il est facile de prendre le temps à l'ouverture du curseur et ensuite à la fermeture, puis de stocker la différence dans votre table.

    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
    DECLARE
      LI$Deb  PLS_INTEGER ;
      LI$Fin  PLS_INTEGER ;
      LN$TIME PLS_INTEGER ;
      CURSOR c IS
      SELECT * FROM all_objects ;
    BEGIN
      LI$Deb := TO_CHAR(SYSDATE,'SSSSS') ;
      FOR cc IN c LOOP
        NULL ;
      END LOOP;
      LI$Fin := TO_CHAR(SYSDATE,'SSSSS') ;  
      LN$TIME := LI$Fin - LI$Deb ;
      DBMS_OUTPUT.PUT_LINE('Dif : ' || LN$TIME ) ;
    END;

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par mikees Voir le message
    ...
    Je ne suis pas vraiment calé en sgbd oracle, tu pourrais détailler un peu plus comment je peux faire ? merci
    Bon, voilà un exemple d'activation de la trace SQL dans votre procédure (il y en a des autres moyens de procéder en fonction de votre version d'Oracle). Vous trouvez sur ce site un tutoriel concernant la trace SQL et les pré requis pour l'activer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create or replace procedure p_open_rc(p_rc Out sys_refcursor) Is
      l_deb		number;
    Begin
      l_deb := dbms_utility.get_time;  
      --
      dbms_session.SESSION_TRACE_ENABLE(TRUE,TRUE);
      --
      open p_rc for select b.* from big b, big t where rownum <= 1000000;
      --
      dbms_output.put_line('Ecoulé :'||to_char(dbms_utility.get_time - l_deb));
    end;
    /
    Mais la partie la plus intéressante se passe dans votre code java, voilà une simulation en sql*plus
    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
    20
    21
    22
    23
    24
    25
    26
    27
     
    SQL> set serveroutput on
    SQL> variable c refcursor
    SQL>
    SQL> exec p_open_rc(:c);
    Ecoulé :7
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
     
    SQL>
    SQL> declare
      2    v big%rowtype;
      3    l_deb            number;
      4  begin
      5    l_deb := dbms_utility.get_time;
      6    --
      7    loop
      8      fetch :c into v;
      9       exit when :c%NOTFOUND;
     10    end loop;
     11    --
     12    dbms_output.put_line('Ecoulé :'||to_char(dbms_utility.get_time - l_deb));
     13  end;
     14  /
    Ecoulé :5114
     
    ProcÚdure PL/SQL terminÚe avec succÞs.
    Ensuite il faut trouver le fichier .trc et l'analyser avec tkprof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tkprof diana_ora_6908.trc ref.prf sort=execpu,fchcpu
    Voilà un extrait des informations qui se trouvent dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT B.* 
    FROM
     BIG B, BIG T WHERE ROWNUM <= 1000000
     
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.00          0          0          0           0
    Execute      1      0.00       0.00          0          0          0           0
    Fetch   1000001      9.81       9.73          0    1000122          0     1000000
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total   1000003      9.81       9.73          0    1000122          0     1000000

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/05/2015, 01h31
  2. Réponses: 8
    Dernier message: 30/07/2013, 15h58
  3. Réponses: 1
    Dernier message: 19/04/2013, 16h11
  4. Réponses: 0
    Dernier message: 01/08/2012, 12h59
  5. [PHP 5.2] Supprimer les variables de session lorsqu'un onglet est fermé
    Par beegees dans le forum Langage
    Réponses: 5
    Dernier message: 16/06/2009, 01h16

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