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 :

ORA-30926 : comment contourner


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Par défaut ORA-30926 : comment contourner
    Bonjour,

    j'ai un soucis avec ma requête merge.
    Cette requête fonctionne :
    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
     
    MERGE INTO invoice t
    USING (                            
        SELECT i.product_code,
           max(f.prs_ssa) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prs_ssa, 
           max(f.csc) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) csc, 
           max(f.prg) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prg     
        FROM invoice i 
          JOIN factures f 
            ON i.product_code = f.code_article
            AND i.invoice_date < f.date_facture
        WHERE (i.csc_euro IS NULL 
            OR i.prg_euro IS NULL
            OR i.prs_ssa_euro IS NULL)
        GROUP BY i.product_code
           ) s
    ON (t.product_code = s.product_code) 
    WHEN MATCHED THEN UPDATE SET t.prs_ssa_euro = s.prs_ssa, t.csc_euro = s.csc, t.prg_euro = s.prg
    par contre celle ci ne fonctionne pas :
    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
     
    MERGE INTO invoice t
    USING (                            
        SELECT i.product_code, f.quantite, i.quantity,
           max(f.prs_ssa) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prs_ssa, 
           max(f.csc) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) csc, 
           max(f.prg) KEEP(DENSE_RANK LAST ORDER BY f.date_facture) prg     
        FROM invoice i 
          JOIN factures f 
            ON i.product_code = f.code_article
            AND i.invoice_date < f.date_facture
        WHERE (i.csc_euro IS NULL 
            OR i.prg_euro IS NULL
            OR i.prs_ssa_euro IS NULL)
        GROUP BY i.product_code, f.quantite, i.quantity
           ) s
    ON (t.product_code = s.product_code) 
    WHEN MATCHED THEN UPDATE SET t.prs_ssa_euro = s.prs_ssa / s.quantite * s.quantity, t.csc_euro = s.csc / s.quantite * s.quantity, t.prg_euro = s.prg / s.quantite * s.quantity
    et me renvoie l'erreur ORA-30926.
    Le calcul effectué pour l'update est OBLIGATOIRE, mais il peut être déplacé autre part dans la requête si besoin est pour contourner l'erreur.
    Le problème est qu'apparemment il existe plusieurs lignes pour la même date et avec le même code produit qui ont des quantités différentes.


    Comment feriez vous (sachant que les 2 tables n'ont pas de clé primaires) pour que la requête fonctionne ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bonjour,


    il y a de grande chance que votre clause ON ne permete pas à oracle de définir une relation 1:1 ou 1:0 entre votre table à updater et la sous-requête.

    De ce fait il ne sait pas quoi faire car il doit y avoir de multiple gr.Reference_ARCEP possible pour 1 ligne de votre table Suivi_production_FH

  3. #3
    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 avez déjà eu la réponse sur l'autre sujet.

    L'erreur signifie que pour une valeur de la table invoice, il y ait plusieurs valeurs candidates telles que définies dans votre requête source et votre critère de jointure.

    C'est à vous d'affiner vos requêtes, on ne peut pas supposer du contenu de vos tables, vous avez la solution générique il faut l'adapter.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Par défaut
    Et s'il n'y a pas de moyens d'affiner plus la requête ?
    Y a t-il une autre solution que le merge ?

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Pourquoi ne pouvez-vous pas affiner plus votre requête ?

    Le problème n'est pas le merge ici mais l'incohérence de votre nouvelle sous-requête, donc un update classic n'y changera rien.

    Pourquoi n'avez vous pas repris la structure max() keep() des autre colonnes pour vos quantités ?

    edit : de plus, pourquoi prendre la colonne "quantity" dans votre sous-requête alors que vous l'avez en direct sur votre table invoice ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Par défaut
    Je ne peux pas plus affiner car les autres informations divergent (incohérence des lignes entre les 2 tables et je ne peux pas y remédier).

    C'est une bonne idée de faire le max() pour la quantité, je n'y avais pas pensé !
    Et oui, je pourrais enlever le quantity que j'ai déjà dans invoice, cette requête me prend tellement la tête que je fais des erreurs bêtes

    Merci beaucoup, je testerais dès que je pourrais de nouveau !

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Par défaut
    Tu m'as (presque) sauvé la vie Punkoff, merci !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/01/2012, 10h54
  2. Ora-054 comment débloquer resource busy?
    Par marion782 dans le forum Oracle
    Réponses: 4
    Dernier message: 22/06/2006, 01h23
  3. Réponses: 6
    Dernier message: 05/04/2006, 15h14
  4. Réponses: 1
    Dernier message: 30/03/2006, 13h03
  5. Comment contourner l'erreur ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/07/2005, 11h21

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