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

Oracle Discussion :

FORALL + gestion d'exception


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 5
    Points : 6
    Points
    6
    Par défaut FORALL + gestion d'exception
    Bonjour,

    Je suis entrain de développer une procédure PL/SQL chargée d’insérer/mettre à jour des données en base. Je cherche un moyen d’optimiser ma procédure.

    Contexte :
    J’utilise Oracle 8i.
    J’ai une table A et une table B (même structure).
    Les données de la table A doivent être insérées dans B si elles n’existent pas, sinon elles doivent être mises à jour.

    Actuellement j’utilise 2 curseurs qui me retournent les lignes à insérer et les lignes à mettre à jour (via un NOT IN pour le premier et une jointure pour le second)
    Ensuite j’utilise du sql dynamique dans ma procédure pour exécuter mes insert/update. Je gère un bloc d’exception dans mes 2 boucles FOR (de maniere a ce que le traitement ne s’arrete pas à la premiere exception).

    Voilà où j’en suis

    J’ai pris connaissance de la commande FORALL qui permet d’envoyer tous mes ordres DML en une fois mais cette commande me pose 1 problème :
    Comment gérer le fait que tous mes ordres DML soient exécutés même si certains sont rejetés par Oracle (du genre doublons de PK…) ??

    De plus, suis-je obligé de gérer une collection pour chaque attribut de mes tables ?? Sachant que je n’insert/met a jour qu’une partie de tous les champs.

    Ya-t-il un autre moyen de faire??

    Merci d’avance pour vos réponses.

    Pascal.

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Dommage que tu ne sois pas en 9i, tu aurais pu utiliser un simple MERGE...

    Si tu tiens à utiliser FORALL, regarde ca : http://asktom.oracle.com/pls/ask/f?p...:8912264456901 Ca explique comment faire un FORALL et catcher les exceptions.

    La méthode classique pour résoudre ton pb est :
    - si tu as plus d'insertion de de maj : tu fais un insert et tu catches l'exception dup_val_on_index auquel cas tu fais l'update
    - si tu as plus de maj que d'insertion : tu fais un update et si sql%rowcount = 0, tu fais un insert.

    Dans les deux cas, tu pars d'un seul curseur qui balaye la table A.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il existe également le même type d'informations en français.
    http://sheikyerbouti.developpez.com/...age=Chap5#L5.5
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    merci pour vos réponses si rapides!!

    J'avais effectivement dèjà essayé la méthode qui consiste à faire un update et tester le rowcount. Mais cette méthode me parraissait peu efficace lorsque la table de départ est quasiment vide. Dans ce cas je vais jongler entre les méthodes (insert ou update en premier)

    Quant à la commande MERGE, j'ai lu qu'elle s'exécutait de manière atomique, soit tout passe soit rien; donc ya-t-il un moyen de mettre à jour/insérer tous les enregistrements même si certains génèrent des exceptions?

    Poiskail.

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

Discussions similaires

  1. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  2. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  3. [C#] Gestion d'exception
    Par ALCINA dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 12h18
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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