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 :

java pl sql dbms log


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut java pl sql dbms log
    Bonjour,

    J'ai un script pl/sql que je lance depuis Java.

    Il s'agit d'un script de purge.

    voici une partie du code pl sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE FROM MOUVEMENT_CERES WHERE.....
    DBMS_OUTPUT.PUT_LINE('Mouvement CERES supprimée') ;
    DELETE FROM MOUVEMENT_TOTO WHERE....
    DBMS_OUTPUT.PUT_LINE('Mouvement TOTO supprimée') ;
    DELETE FROM MOUVEMENT_TITIWHERE....
    DBMS_OUTPUT.PUT_LINE('Mouvement TITI supprimée') ;
    En java, j'appel le code de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CallableStatement plsqlBlock = queryRunner.prepareCall (requetePLSQL);
    plsqlBlock.execute();
    J'aimerai pouvoir afficher en continue les logs des lignes des tables qui ont été supprimées pendant l'exécution du script,mais elles ne s'affichent pas.

    J'ai donc suivi les indications de ce site : http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::11_QUESTION_ID:45027262935845

    Mais il m'affiche les logs du pl/sql à la fin de l'éxecution et non pendant.

    Je demande cela car comme le script pl/sql est long, c'est pour informer l'utilisateur où en est le script.

    Merci d'avance.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Je n'ai pas trop de compétences en Java.
    Mais dans ton traitement plsql tu peux mettre à jour une info de la session (dbms_application_info.set_action) que tu pourrais lire depuis une autre session Oracle

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    je vais essayer de voir si c'est possible.

    Peut être en lançant 2 threads. mais bon, je suis sceptique

    merci pour ta piste, je vais essayer

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    J'avais laissé tombé ce problème.... Mais finalement, j'en ai besoin ....

    J'ai essayé d'utiliser spool > nomfichier en début de mon script pl sql. Mais c'est une commande PL/SQL et donc comme j'exécute mon script à partir de java, ça fonctionne pas...

    J'ai essayé d'utiliser UTF_FILE, mais ça ne marche pas car n'ayant pas les droits système pour changer le répertoire.. je ne peux rien faire.....

    Il y a une autre solution mais je ne sais pas si c'est performant...
    Connaissant les tables à supprimer, je stockerai dans une liste les noms des tables :

    voici la solution :

    Code 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
    16
    17
    18
    19
    20
    21
    22
    23
     
    List listeTablesASupprimer = new ArrayList();
    listeTablesASupprimer.add("MOUVEMENT_CERES");
    listeTablesASupprimer.add("MOUVEMENT_TOTO");
    listeTablesASupprimer.add("MOUVEMENT_TITI");
     
    Iterator itTablesASupprimer = listeTablesASupprimer.iterator();
    while (itTablesASupprimer .hasNext()) {
      String nomTable = (String) itTablesASupprimer.next();
      CallableStatement plsqlBlock = queryRunner.prepareCall (requetePLSQL);
      //je passe ici en paramètre le nom de la table au script pl/sql.  
      //je me souviens plus de la syntaxe exacte du passage de paramètre
      //j'écris un truc bidon
      plsqlBlock.addParameter(nomTable)
      //execute du bloc pl/sql
      plsqlBlock.execute();
     
     //J'affiche ici mon log.
      log.info ("TABLE " + nomTABLE + " supprimée");
     
     
     
    }
    voici le script pl/sql.
    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
     
    declare
    nomtable VARCHAR := ?; //je récupère la table passé en paramètre depuis le code JAVA
    begin
    ....
    if (nomtable == 'MOUVEMENT_CERES') then
     DELETE FROM MOUVEMENT_CERES WHERE.....
    endif
     
    if (nomtable == 'MOUVEMENT_TOTO') then
     DELETE FROM MOUVEMENT_TOTO WHERE....
    end if 
     
    if (nomtable == 'MOUVEMENT_TITI') then
      DELETE FROM MOUVEMENT_TITIWHERE....
    end if
    ...
    Evidemment, ne faites pas gaffe à la syntaxe, je n'ai pas modifié encore mon code. Je l'écris comme ça uniquement pour le forum.. Je ne peux pas le tester actuellement. C'est juste un pseudo-code.J'aimerai juste avoir votre avis sur ce sujet.

    Actuellement, je supprime environ 250 tables.
    Donc 250 boucles.. donc 250 prepareCall...

    Qu'en pensez-vous ?

    merci..

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    il y aurait une autre solution.

    ça serait d'ajouter les logs dans une table...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE FROM MOUVEMENT_CERES WHERE.....
    INSERT INTO LOG values (S_LOG.NEXT_VAL, "mouvement ceres supprimée");
    DELETE FROM MOUVEMENT_TOTO WHERE....
    INSERT INTO LOG values (S_LOG.NEXT_VAL, "mouvement toto supprimée");
    DELETE FROM MOUVEMENT_TITI WHERE....
    INSERT INTO LOG values (S_LOG.NEXT_VAL, "mouvement titi supprimée");
    Or si y a un pb sur un delete, il faut faire un rollback sur les delete et non les insert ....

    avez-vous une idée sur ce point là ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Il faut créer une procédure autonome :
    PRAGMA AUTONOMOUS_TRANSACTION

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    je ne connaissais pas... merci de cette idée...

    mais j'ai un petit souci, actuellement, avec l'environnement dont je dispose en dév et en prod, on a pas le droit de créer des procédure...

    Je peux juste éxécuter un bloc pl/sql...

    Y a t-il un moyen d'utiliser PRAGMA AUTONOMOUS_TRANSACTION dans un bloc pl sans créer de procédure ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    je suis entrain de faire des tests....

    merci de ton aide...

    j'ai réussi à créer une procédure dans un bloc pl/sql...

    Je fais un petit test, et demain, je verrai en utilisant la base de dev, si ça fonctionne comme je le souhaite...

    Merci de ta piste...

    Je répondrai demain pour voir si ça marche réellement :-) !!

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    j'ai testé sur un petit jeu de donnée de test avec 3 tables.
    ça a l'air de fonctionner...

    J'espère que j'aurai une bonne surprise demain matin :-) ....

    merci beaucoup en tout cas....

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    voici mon code pl / sql


    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
     
     
    declare
    procedure insert_to_table_a (nomTable VARCHAR2)  is
      PRAGMA AUTONOMOUS_TRANSACTION;
      begin
        insert into log values (S_LOG.nextval, 'table supprimée ' || nomTable);
        commit;
      end;
    begin
    delete from company where cmp_idcompany = 10;
    insert_to_table_a('company');
    delete from company where cmp_idcompany = 11;
    insert_to_table_a('testEkrem');
    delete from company where cmp_idcompany = 4;
    insert_to_table_a('dernierTable');
    EXCEPTION
     WHEN OTHERS THEN
        rollback;
    end;
    J'ai fait exprès de faire planter au dernier delete.

    J'ai dans ma table de LOG, les deux premiers insert.
    Le dernier delete plante car l'id a une référence dans une autre table.
    J'ai donc une violation de contrainte.

    Il fait un rollback sur tous les deletes.

    Et a bien inséré deux logs dans la table LOG

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    franchement super !!

    ça marche parfaitement....

    J'ai mis en place côté java le multithreading. et côté pl/sql la notion de transaction autonome que tu m'a fourni...

    et là c'est parfait !

    merci beaucoup .....

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

Discussions similaires

  1. java requete SQL à *.mdb
    Par Belegkarnil dans le forum JDBC
    Réponses: 4
    Dernier message: 18/03/2006, 11h24
  2. Communication JAVA & PL/SQL
    Par Titouf dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/01/2006, 10h18
  3. java et sql server
    Par vijeo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 09h57
  4. [JDBC]Eclispe java et sql 2000
    Par vijeo dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/10/2005, 11h31
  5. Réponses: 2
    Dernier message: 06/10/2004, 18h09

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