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 :

Optimisation traitement SQL


Sujet :

PL/SQL Oracle

  1. #21
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Create or replace
     
       INSERT INTO RDO_LOG ( 
                   NOM_TABLE,
                   NB_LIGNES_INSEREES,
                   DATE_TRAITEMENT)
      VALUES (pe_table,  pe_nblignes, pe_date );

    Les variables pe_table, pe_nblignes et pe_date ne sont pas valuées, à quoi sert cette insertion à ce niveau ?

  2. #22
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Mais pourquoi cet Insert ?!
    As-tu bien compris à quoi sert la procédure LOG ? Justement à ne pas mettre dans ton code principal un INSERT INTO LOG ..

  3. #23
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    OK merci ..avec votre question, j'ai mieux compris la réponse
    voici mon script qui fonctionne maintenant sans l'insert dans la deuxième requête.
    Merci

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Create or replace
    PROCEDURE ALIM IS 
     
    	LN$Cpt PLS_INTEGER ;
     
     PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAULT SYSDATE) IS
     
      BEGIN
       INSERT INTO RDO_LOG ( 
                   NOM_TABLE,
                   NB_LIGNES_INSEREES,
                   DATE_TRAITEMENT)
      VALUES (pe_table,  pe_nblignes, pe_date );
     
    END LOG;
     
    BEGIN 
     
      SELECT COUNT(*) INTO LN$Cpt FROM TABLEA; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEA', 'Count(*)', LN$Cpt);
     
       INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT);
     
     
    SELECT COUNT(*) INTO LN$Cpt FROM TABLEB; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEB', 'Count(*)', LN$Cpt);
     
    	INSERT INTO TABLEB  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM W
      UNION
      SELECT JOUR,ENT,BAT  FROM V;
     
      LOG('TABLEB', 'INSERT', SQL%ROWCOUNT);
     
    END ALIM;

  4. #24
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Tu dois avoir un problème dans les valeurs transmises dans le VALUES.
    Contrôle les types de données transmis et attendus.

    Est-ce que la requête seule d'insert fonctionne si tu remplaces en dur les données transmises ?

    EDIT : Argh !! bien vu MCM je n'avais même pas vu que c'était la table de LOG dont il était question

  5. #25
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par McM Voir le message
    Pas besoin de t'embêter à créer un package à moins de vouloir réutiliser la procédure de log depuis un autre endroit, une simple procédure suffit.

    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
    PROCEDURE ALIM_BASE IS 
     
    	LN$Cpt PLS_INTEGER ;
     
      PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAUT SYSDATE) IS
      BEGIN
        INSERT INTO table_log [..]
      END LOG;
     
    BEGIN 
     
      SELECT COUNT(*) INTO LN$Cpt FROM TABLEA ; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEA', 'Count(*)', LN$Cpt);
     
      INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT);
     
    END ALIM_BASE;
    Bonjour,
    Comment faire pour ajouter un flag qui permet de dire que la requête est bien exécutée et terminée ?
    En effet, j'ai plusieurs requêtes dans le Pl et en cas de plantage, je souhaite relancer mon script mais uniquement les requêtes non exécutées (flag =0 par exemple)
    Mon PL contient plusieurs requêtes insert d'ou le contrôle.
    L'idée est de postionner un flag qui passe à 1 lorsque la requête est exécutée.
    et 0 lorsque ce n'est pas OK. ainsi la relance du script contrôle la date et le flag et en cas de flag à 0 alors execution.
    Au début, je dois savoir initialisé ma table de log avec la date et le flag à 0

    Merci beaucoup

  6. #26
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Code sql : 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
     PROCEDURE ALIM_BASE IS 
     
    	LN$Cpt PLS_INTEGER ;
     -- ajouter le flag et initialiser le flag à 0 dans l'insert suivant
      PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAUT SYSDATE) IS
      BEGIN
        INSERT INTO table_log [..]
      END LOG;
     
    BEGIN 
     
      SELECT COUNT(*) INTO LN$Cpt FROM TABLEA ; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEA', 'Count(*)', LN$Cpt);
     
      INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT);
     
    -- faire un update du flag à 1 
     
    END ALIM_BASE;

    je crois que je dois ajouter le flag dans la table log et ensuite faire un update à chaque execution de requête.
    Je vous remercie de votre aide

  7. #27
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Citation Envoyé par decisio Voir le message
    Code sql : 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
     PROCEDURE ALIM_BASE IS 
     
    	LN$Cpt PLS_INTEGER ;
     -- ajouter le flag et initialiser le flag à 0 dans l'insert suivant
      PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAUT SYSDATE) IS
      BEGIN
        INSERT INTO table_log [..]
      END LOG;
     
    BEGIN 
     
      SELECT COUNT(*) INTO LN$Cpt FROM TABLEA ; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEA', 'Count(*)', LN$Cpt);
     
      INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT);
     
    -- faire un update du flag à 1 
     
    END ALIM_BASE;

    je crois que je dois ajouter le flag dans la table log et ensuite faire un update à chaque execution de requête.
    Je vous remercie de votre aide

    cette procédure vous parait t-elle correcte :

    Code sql : 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
    28
     
    PROCEDURE ALIM_BASE IS 
     
    	LN$Cpt PLS_INTEGER ;
     
      PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAUT SYSDATE , pe_flag  IN VARCHAR2(1) ) IS
      BEGIN
        INSERT INTO table_log [TABLE,
                   NB_INSEREES,
                   DATE_TRT,
                   FLAG]
      END LOG;
     
    BEGIN 
     
      SELECT COUNT(*) INTO LN$Cpt FROM TABLEA ; 
      DBMS_OUTPUT.PUT_LINE( TO_CHAR( LN$Cpt ) || ' enreg_MASS') ; 
     	LOG('TABLEA', 'Count(*)', LN$Cpt);
     
      INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT, '1');
     
    END ALIM_BASE;

    Merci d'avance

  8. #28
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Non elle n'est pas correcte car le Flag n'a pas de valeur par défaut, il est donc nécessaire de préciser sa valeur à chaque appel ou de lui affecter une valeur par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      PROCEDURE LOG (pe_table IN VARCHAR2, pe_dml IN VARCHAR2,
          pe_nblignes IN NUMBER, pe_date IN DATE DEFAUT SYSDATE , pe_flag  IN VARCHAR2(1) ) IS
    [..]
     
    BEGIN 
     
      [..]
      LOG('TABLEA', 'Count(*)', LN$Cpt);
     
      [..]
      LOG('TABLEA', 'INSERT', SQL%ROWCOUNT, '1');
    Par contre je ne vois pas trop l'intérêt de ton flag car vu ton code, si tu trouves le log "TABLEA / INSERT" c'est que la requête s'est bien exécutée sinon non.

    Pour faire une véritable gestion de code état/statut, il faudrait avant l'exécution de la requête insérer une ligne dans la table LOG en tant que "non-exécutée" et mettre à jour le statut après exécution pour préciser s'il y a eu erreur ou non

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [AC-2010] Optimisation traitement sql
    Par F.ORTIZ dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/07/2013, 11h58
  2. [PHP 5.4] Optimisation des traitements (SQL)
    Par qltmi dans le forum Langage
    Réponses: 1
    Dernier message: 06/04/2013, 12h59
  3. [AC-2007] Optimisation de traitements SQL sous VBA
    Par C_Kloug dans le forum VBA Access
    Réponses: 9
    Dernier message: 06/10/2009, 14h22
  4. [SQL Server 2000] Optimisation traitement
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/02/2008, 12h22
  5. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 17h01

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