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

SQL Oracle Discussion :

update et insert


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut update et insert
    bonjour;

    je voudrais mettre en place du code pl/SQL pour réaliser des inserts lorsque je ne trouve pas l'occurence recherchée et donc le cas échéant controler si l'occurence est toujours valide par rapport aux données en paramètres

    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
     
        BEGIN
          SELECT * INTO v_acquereur FROM ACQUEREUR
          WHERE ACQUEREUR.ORGANISME_ACQUEREUR_ENVOYE_CAP = saa_evt_obj.ORGANISME_ACQUEREUR_ENVOYE_CAP;
     
          IF v_acquereur.BANQUE_REFERENCE != saa_evt_obj.BANQUE_REFERENCE OR  v_acquereur.CODE_PAYS_ACQUEREUR != saa_evt_obj.CODE_PAYS_ACQUEREUR THEN
            UPDATE ACQUEREUR
            SET ACQUEREUR.BANQUE_REFERENCE =  saa_evt_obj.BANQUE_REFERENCE,
          ACQUEREUR.CODE_PAYS_ACQUEREUR = saa_evt_obj.CODE_PAYS_ACQUEREUR;
          END IF;
     
          EXCEPTION
          WHEN NO_DATA_FOUND THEN
            INSERT INTO ACQUEREUR
            (ORGANISME_ACQUEREUR_ENVOYE_CAP, BANQUE_REFERENCE, CODE_PAYS_ACQUEREUR)
          VALUES (saa_evt_obj.ORGANISME_ACQUEREUR_ENVOYE_CAP, saa_evt_obj.BANQUE_REFERENCE, saa_evt_obj.CODE_PAYS_ACQUEREUR);
        END ;
    je me demande si c'est bon, normalement le select leve une exception si l'instruction ne renvoie rien donc je ne fais pas l'update.
    y a a t-il une méthode plus optimisé ? un code plus clair ?

  2. #2
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    déja je pense que le test pour savoir s'il est nécéssaire d'updater est couteux, il faut updater à chaque fois.

  3. #3
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    pris comme ça, je pense que c'est optimisé au max (c'est pas le cout d'un test qui va peser bien lourd par rapport aux requêtes...)

    Cependant, tu ne décrit pas comment du récupère ton record saa_evt_obj. C'est peut etre avec cette action que tu peux capitaliser des traitement.

    Pour les update/insert il y a le merge qui parait-il est le plus éfficace (j'ai jamais pu le tester sur des gros volumes).

    Sinon y'a une autre méthode qui consiste à faire l'update, récupérer le SQL%ROWCOUT et faire l'insert si ce dernier est à 0.

    Mais dans le cas que tu montres, ce n'est pas le même critère dans ton select et dans ton update, donc je vois pas trop comment améliorer

  4. #4
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Citation Envoyé par remi4444
    pris comme ça, je pense que c'est optimisé au max (c'est pas le cout d'un test qui va peser bien lourd par rapport aux requêtes...)

    Cependant, tu ne décrit pas comment du récupère ton record saa_evt_obj. C'est peut etre avec cette action que tu peux capitaliser des traitement.

    Pour les update/insert il y a le merge qui parait-il est le plus éfficace (j'ai jamais pu le tester sur des gros volumes).

    Sinon y'a une autre méthode qui consiste à faire l'update, récupérer le SQL%ROWCOUT et faire l'insert si ce dernier est à 0.

    Mais dans le cas que tu montres, ce n'est pas le même critère dans ton select et dans ton update, donc je vois pas trop comment améliorer
    je me corrige l'update est extrement couteux il m'a diminué mes perfs * 10
    je suis en train de tester avec les IF pour éviter l'update
    Ensuite je testerais en éliminant le SELECT avec un RETURNING sur l'update

  5. #5
    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
    C'est normal l'UPDATE sans WHERE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ACQUEREUR
            SET ACQUEREUR.BANQUE_REFERENCE =  saa_evt_obj.BANQUE_REFERENCE,
          ACQUEREUR.CODE_PAYS_ACQUEREUR = saa_evt_obj.CODE_PAYS_ACQUEREUR;
    Sinon question perfs, ça veut dire quoi le diminué par 10 ?
    Combien d'enregistrements, quels temps, etc...

  6. #6
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par McM
    C'est normal l'UPDATE sans WHERE ?
    ah oui j'avais pas vu!

  7. #7
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 36
    Par défaut
    Citation Envoyé par remi4444
    ah oui j'avais pas vu!

    correction ca me fait baisser les perfs que par deux en rajoutant le where que j'avais oublié

    1 millions d'enregistrement sur une table
    500 sur une autre
    1 millions sur une dernière

    7 millions sur la table qui référence en FK les trois premières (que des inserts sur celle ci)

    77 champs répartis dans toutes les tables

    200 intégrations de messages par seconde en moy
    210 en max, 186 en min
    pour une injection de messages 300 / s

    180 000 messages intégrés

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    je pense qu'un MERGE serait le bienvenu pour remplacer tout ça non ?

  9. #9
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par grosFab
    [...]
    1 millions d'enregistrement sur une table
    500 sur une autre
    1 millions sur une dernière

    7 millions sur la table qui référence en FK les trois premières (que des inserts sur celle ci)

    77 champs répartis dans toutes les tables
    [...]
    Je trouve que tu reste un peu trop général, c'est impossible de donner une solution optimisée de manière générale. Dans ton cas précis, Il y a une seule table qui est concernée, c'est ACQUEREUR. Combien fait-elle de lignes, quelles sont les colonnes indexées? quelle est exactement la clause WHERE que tu avais oublié ? Est-tu sur de ne pas faire trop d'update à chaque fois (testes-tu le SQL%ROWCOUNT apres chaque update ?)

    A priori, et étant donné que sur l'exemple que tu montre, une seule table est concernée, je tenterais 2 requêtes ensemblistes (à l'aide des EXISTS/NOT EXISTS), une pour l'update, et une pour l'insert.

Discussions similaires

  1. [SQL2K][BCK] erreur de syntax pour update et insert
    Par lifecraft dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/02/2006, 10h31
  2. update or insert
    Par jarod_bx dans le forum Access
    Réponses: 3
    Dernier message: 09/01/2006, 19h03
  3. sql update et insert dans la meme requete
    Par Jessicaa dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/12/2005, 15h39
  4. Réponses: 8
    Dernier message: 22/06/2005, 10h34
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

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