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 :

Insert, update en PLSQL


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut Insert, update en PLSQL
    Bonjour a tous,

    Je debute en PL/SQL et j'ai du mal a creer une requete.

    Cette requete doit :

    1)inserer des lignes de la table A dans la table B (condition: lignes de la table A qui n'existent pas dans B)

    2) updater les lignes de tableB qui sont aussi dans tableA.

    (donc la procedure doit recuperer les nouvelles lignes et updater les lignes existantes)

    Cette procedure tournera chaque fin de mois.

    J'ai cree la requete suivante :


    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  SP_UPDATE_table_B
     
    BEGIN
     
    INSERT INTO tableB (a,b,c,d,e,f,g,h,i,j,k, l,m,n,o,p)
    SELECT a,b,c,d,e,f,g,h,i,j, r as k,  s as l, t as m, u as n, v as o, w as p
      FROM tableA
     WHERE tableA.a not in (select a from tableB);
     
     update tableB
     set  k= tableB.k + tableA., 
             l=......,
             M= .....,
            n=..... ,     
            o=......,
            p= ......
     WHERE tableA.a in (select a from tableB);
     
    END;
    J'ai change les noms des champs pour simplifier.

    Cette requete ne tourne pas sur TOAD, faut-il creer une variable de type Rowtype pour recuperer toutes les valeurs d'une ligne puis creer une autre variable de type tab pour recuperer toutes les lignes de la table A qui ne sont pas dans la table B ?

    J'ai lu sur un tutoriel que le select dans une procedure stockee ne doit ramener qu'une seule valeur.

    Merci d'avance a ceux qui pourront m'aider, je galere et je devais finir aujourd'hui, c'est un pour un projet au boulot.

    Bonne fin de journee

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous devriez regarder du côté de l'instruction MERGE.
    Quelle est votre version d'Oracle ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut
    Oracle 10.

    Je ne sais pas si j'ai besoin de créer des parametres dans la procédure.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et bien ça dépend si vous en avez besoin ou pas.
    Soit votre requête est autonome, soit vous l'appellez avec des paramètres.
    N'oubliez pas de regarder l'opérateur MERGE comme je vous l'ai conseillé.

  5. #5
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 23
    Par défaut
    Oui je tente le merge,

    voici la requete que je tente d'executer sur TOAD:

    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
    MERGE INTO table1 
    USING table2 
    ON (M_NB = table2.M_NB)
    WHEN MATCHED 
    THEN UPDATE
    SET
    ITDAMT= table1.ITDAMNT + table2.EN_AMT, 
    MTDAMNT=table2.EN_AMT,
    YTDAMNT= (if substr(table2.ent_date,-6,3)='JAN' then 0 else table1.YTDAMNT ) +table2.EN_AMT,
    ITDRPTAMNT=ITDRPTAMNT+table2.EN_AMT_FX,
    MTDRPTAMNT =table2.EN_AMT_FX,
    YTDRPTAMNT= (if substr(mth.ent_date,-6,3)='JAN' then 0 else table2.YTDRPTAMNT)+table2.EN_AMT_FX
     
    WHEN NOT MATCHED 
    THEN INSERT (PFOLIO, NB, EN_CUR, LABEL, EN_TYPE, RULE, 
    EN_COM, LG, ENT_DATE, SPOT, ITDAMNT, YTDAMNT, MTDAMNT, ITDRPTAMNT,YTDRPTAMNT, MTDRPTAMNT)
     
    VALUES (table2.PFOLIO, table2.NB, table2.EN_CUR, table2.LABEL, table2.EN_TYPE, table2.RULE, table2.EN_COM,
    table2.LG, table2.ENT_DATE, table2.SPOT, table2.EN_AMT as ITDAMNT, table2.EN_AMT as YTDAMNT, table2.EN_AMT as MTDAMNT,table2.EN_AMT_FX as ITDRPTAMNT, table2.EN_AMT_FX as YTDRPTAMNT, table2.EN_AMT_FX as MTDRPTAMNT ) ;


    Cette requete me retourne un message d'erreur: "invalid sql statement" mais sans plus de details.

    Je pense que je suis tout pret de la finaliser, mais il me manque "l'enrobage".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create or replace procedure SP_UPDATE_table1
    begin
    requete citee plus haut
    end;
    Est-ce que cette requete est correcte?


    Je n'ai pas utilise de parametre, je n'en vois pas l'utilite.

    Merci d'avance

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il n'y a pas de IF en SQL, il faut donc faire un CASE ou un DECODE.
    Je vous conseille de bien aliaser vos deux tables dans votre merge.

    Pour la procédure stockée, il manque un IS avant le begin.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/10/2014, 11h19
  2. [C#][2.0] Traitement de Formulaire (Insert / Update)
    Par softflower dans le forum ASP.NET
    Réponses: 7
    Dernier message: 17/02/2006, 13h44
  3. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  4. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31
  5. [Info] Insert/Update si problèmes divers
    Par portu dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/07/2004, 10h17

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