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 :

Reprise script PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Par défaut Reprise script PL/SQL
    Bonjour,
    J'ai un traitement PL SQL qui exécute plusieurs requêtes insert.
    le script insère des données dans une table de travail ( date_traitement / table_rempli / nb_ligne / flag_trait )
    J'ai un souci avec la méthode de reprise :
    Comme j’insère une ligne après le traitement de chaque de requête. Comment puis-je identifier les tables qui ne sont pas traités
    J’ai pensé à modifier mon script en utilisant la fonction IF NOT EXISTS (SELECT
    Nom_table, date_traitement, flag
    FROM RDO_LOG WHERE Nom_Table = '' AND Date_Traitement = ) INSERT
    Qu'en pensez-vous ?

    Voici mon script :

    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
     
    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 INTEGER ) 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 de votre aide

  2. #2
    Membre actif
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Par défaut
    Citation Envoyé par decisio Voir le message
    Bonjour,
    J'ai un traitement PL SQL qui exécute plusieurs requêtes insert.
    le script insère des données dans une table de travail ( date_traitement / table_rempli / nb_ligne / flag_trait )
    J'ai un souci avec la méthode de reprise :
    Comme j’insère une ligne après le traitement de chaque de requête. Comment puis-je identifier les tables qui ne sont pas traités
    J’ai pensé à modifier mon script en utilisant la fonction IF NOT EXISTS (SELECT
    Nom_table, date_traitement, flag
    FROM RDO_LOG WHERE Nom_Table = '' AND Date_Traitement = ) INSERT
    Qu'en pensez-vous ?

    Voici mon script :

    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
     
    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 INTEGER ) 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 de votre aide
    J'ai fais un script qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO xx
    ( ...)
    FROM 
    WHERE NOT EXISTS  (SELECT nom_table FROM LOG WHERE Nom_Table = '..' 
    AND trunc(date_traitement)>= trunc(sysdate) AND FLAG_TRT=1 )
    qu'en pensez vous ?
    merci

  3. #3
    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
    Normalement l’ensemble du script est une seule transaction soit tout passe soit tout casse. Donc votre script devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Insert into table cible1 select * from table source1 Where Not Exists le même enregistrement dans la table cible1.
    Insert into log values ('CIBLE1', SQL%ROWCOUNT, Sysdate)
    Insert into table cible2 select * from table source2 Where Not Exists le même enregistrement dans la table cible2.
    Insert into log values ('CIBLE2', SQL%ROWCOUNT, Sysdate)
    Etc…
    Commit ;
    Ce type de script pourrait être exécuté plusieurs fois en ajoutant à chaque instant dans les tables cibles ce qui pour une raison ou une autre n’a pas déjà été traité.

  4. #4
    Membre actif
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Normalement l’ensemble du script est une seule transaction soit tout passe soit tout casse. Donc votre script devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Insert into table cible1 select * from table source1 Where Not Exists le même enregistrement dans la table cible1.
    Insert into log values ('CIBLE1', SQL%ROWCOUNT, Sysdate)
    Insert into table cible2 select * from table source2 Where Not Exists le même enregistrement dans la table cible2.
    Insert into log values ('CIBLE2', SQL%ROWCOUNT, Sysdate)
    Etc…
    Commit ;
    Ce type de script pourrait être exécuté plusieurs fois en ajoutant à chaque instant dans les tables cibles ce qui pour une raison ou une autre n’a pas déjà été traité.
    Merci mais du coup je n'arrive plus à compliler mon script
    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
     
    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 INTEGER ) IS
      BEGIN
        INSERT INTO table_log [TABLE,
                   NB_INSEREES,
                   DATE_TRT,
                   FLAG]
      END LOG;
     
    BEGIN
     
      INSERT INTO TABLEA  ( JOUR,ENT,BAT)
      SELECT JOUR,ENT,BAT  FROM X
      UNION
      SELECT JOUR,ENT,BAT  FROM Y;
     
      insert into log values ('TABLEA', 'INSERT', SQL%ROWCOUNT, 1);
    commit;
     END ALIM_BASE;

    l'erreur au niveau de l'insert : PLS-00103 BEGIN FONCTION PRAGMA

  5. #5
    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'y pas de "pragma" dans le code que vous avez posté.

  6. #6
    Membre actif
    Inscrit en
    Septembre 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 63
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Il n'y pas de "pragma" dans le code que vous avez posté.
    En fait avec ce code à la fin cela fonctionne
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
      log ('TABLEA', sysdate , SQL%ROWCOUNT, 1);


    mais pas avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
     INSERT INTO log VALUES ('TABLEA', sydate , SQL%ROWCOUNT, 1);

    je ne comprend pas pourquoi l'insert ne fonctionne pas

    PAR CONTRE, quand je remplace dans l'insert le SQL%ROWCOUNT par 1 dans les values, le script passe.
    Avez vous une idée svp ? merci

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

Discussions similaires

  1. execution partielle d'un script PL/SQL
    Par dyvim dans le forum PL/SQL
    Réponses: 24
    Dernier message: 29/12/2005, 11h33
  2. Execution Script PL/SQL
    Par hair_peace dans le forum PL/SQL
    Réponses: 13
    Dernier message: 29/06/2005, 10h55
  3. Réponses: 24
    Dernier message: 31/05/2005, 15h07
  4. Ecriture de script en SQL
    Par gillou4 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/04/2005, 09h23
  5. [intermedia] besoin d'aide sur script PL/SQL
    Par SteelBox dans le forum PL/SQL
    Réponses: 8
    Dernier message: 05/01/2004, 19h59

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