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 :

pb execution de fonction


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut pb execution de fonction
    salut ,
    j'ai la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace function aa(a number)  return number is
      Result number;
    begin 
     update test set x = a ;
      result := sql%rowcount;
      return(Result);
    end aa;
    et en executant cette fonction il me donne le message suivant :
    ORA-14551: impossible d'effectuer une opération DML dans une interrogation
    ORA-06512: à "AMEN.AA", ligne 5
    ORA-06512: à ligne 1
    est ce que je peux savoir la cause,
    Merci,

  2. #2
    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
    si tu appelles la fonction dans un SELECT, la fonction ne peut pas modifier les données.

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    Oui j'appele la fonction dans un select ,
    est ce que je peux pourquoi elle ne peut pas modifier les donner

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut

    http://www.developpez.net/forums/sho...ight=DML+query
    http://www.developpez.net/forums/sho...ight=DML+query
    http://www.developpez.net/forums/sho...ight=DML+query
    ...

    http://ora-14551.ora-code.com/?txt_erreur=14551 :
    ORA-14551: cannot perform a DML operation inside a query
    Cause: DML operation like insert, update, delete or select-for-update cannot be performed inside a query or under a PDML slave.
    Action: Ensure that the offending DML operation is not performed or use an autonomous transaction to perform the DML operation within the query or PDML slave.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Voir aussi le Oracle® Database PL/SQL User's Guide and Reference:
    http://download-uk.oracle.com/docs/c...ams.htm#i22204

  6. #6
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    Merci pour vous tous;

  7. #7
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Bonjour Daliok,

    Ce que tu veux faire est possible, mais je ne l'encourage pas. En fait, il faut utiliser une transaction autonome dans ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE FUNCTION aa(a number)  RETURN number IS
      pragma autonomous_transaction ;
      Result number;
    begin 
     UPDATE test SET x = a ;
     result := sql%rowcount;
     commit ;
     RETURN(Result);
    end aa;
    /
    D'ailleurs, je te remercie d'avoir posé la question, car grâce à toi, j'ai compris pourquoi sur un des projets dont j'ai hérité, les développeurs avaient collé de la transaction autonome dans toutes leurs fonctions PL/SQL.

    C'est en fait parce que leurs fonctions sont appelées depuis un Shell sous SQL*Plus, par une commande du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select maFonction (param) from dual ;
    Comme quoi, même avec des années d'expérience, on en apprend tous les jours !!!

  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
    en effet, c'est une solution mais dans ce cas précis j'encourage à éviter la fonction pour utiliser du SQL simple

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    190
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 190
    Par défaut
    je vous remerci encore une fois ,rouardg votre intervention ma beaucoup idé

  10. #10
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Fred_D
    en effet, c'est une solution mais dans ce cas précis j'encourage à éviter la fonction pour utiliser du SQL simple
    +1
    De plus il faut penser à commiter dans la fonction. Et attention au risque d'incohérence de données en cas de rollback à un niveau supérieur. Pour moi l'utilisation des transactions autonome doit rester exceptionnelle et être mûrement réfléchie.

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Est-ce qu'il peut y avoir un risque d'incohérence des données avec une transaction autonome ? Je ne crois pas, car la transaction autonome ne peut pas voir les données modifiées par la transaction principale, Oracle ne permet pas les lectures "sales". Que la transaction principale fasse COMMIT ou ROLLBACK ne peut avoir d'influence sur la transaction autonome:
    http://download-uk.oracle.com/docs/c....htm#sthref666

  12. #12
    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
    Ce que voulait dire PlaineR c'est que dans ta procédure principale, tu fais appel à la fonction, puis tu fais un ROLLBACK suite à une erreur.
    La fonction a quand même commité ses modifications.

  13. #13
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par pifor
    Est-ce qu'il peut y avoir un risque d'incohérence des données avec une transaction autonome ? Je ne crois pas, car la transaction autonome ne peut pas voir les données modifiées par la transaction principale, Oracle ne permet pas les lectures "sales". Que la transaction principale fasse COMMIT ou ROLLBACK ne peut avoir d'influence sur la transaction autonome:
    http://download-uk.oracle.com/docs/c....htm#sthref666
    J'ai eu le cas d'incohérence de données à cause de transaction autonome et on a mis du temps à trouver d'où cela venait. On avait une fonction qui renvoyait un numéro unique et sans trou. Pour pouvoir l'appeler à partir d'un select un développeur l'avait passé en autonomous. On faisait un rollback dans le traitement appelant et évidemment le rollback n'était pas fait dans la table de numérotation unique. Nous avons également eu le cas d'une procédure autonome faisant un delete sur le maître (passé en paramètre) alors que l'on rollbackait plus loin le delete du détail.

  14. #14
    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
    exemple :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    SQL> create table fred1 (col number);
     
    Table créée.
     
    SQL> create table fred2 (col number);
     
    Table créée.
     
    SQL> create function fred_f RETURN number is
      2  pragma autonomous_transaction ;
      3    Result number;
      4  begin 
      5  insert into fred2 values (2);
      6  commit;
      7  return 0;
      8  end;
      9  /
     
    Fonction créée.
     
    SQL> select fred_f from dual;
     
        FRED_F
    ----------
             0
     
    SQL> select * from fred2;
     
           COL
    ----------
             2
     
    SQL> insert into fred1 values (1);
     
    1 ligne créée.
     
    SQL>  select fred_f from dual;
     
        FRED_F
    ----------
             0
     
    SQL> 
    SQL> rollback;
     
    Annulation (rollback) effectuée.
     
    SQL> select * from fred1;
     
    aucune ligne sélectionnée
     
    SQL> select * from fred2;
     
           COL
    ----------
             2
             2
    le COMMIT de la procedure autonome n'est pas propagé ce qui peut poser problème

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Le COMMIT ne doit pas être propagé: c'est normal. Une transaction autonome n'est qu'une transaction indépendante, qui le temps de l'exécution suspend l'exécution de la transaction principale, et redonne la main à la transaction principale: le COMMIT de la transaction autonome/indépendante ne concerne que la transaction indépendante et non la transaction principale.

    On peut considérer une transaction autonome comme une transaction concurrente de la transaction principale à la différence que les 2 s'exécutent dans la même session.

  16. #16
    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
    certes, mais on ne le soulignera jamais assez

  17. #17
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Citation Envoyé par pifor
    On peut considérer une transaction autonome comme une transaction concurrente de la transaction principale à la différence que les 2 s'exécutent dans la même session.
    Pour rebondir la dessus et sur les bugs bizarres que l'on peut avoir avec les transactions autonomes.

    J'ai eu le cas suivant ou une session etait en Deadlock avec .... elle meme

    Apres un peu de recherche j'ai vu que mon package faisait un update sur une table puis une peu plus lancait une autre procédure du package en transation autonome qui faisait un autre update sur la meme table. Et bingo, Deadlock ! !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  2. Réponses: 1
    Dernier message: 17/10/2005, 22h47
  3. [VBA] Executer une fonction en passant son nom en argument
    Par David Guyon dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2005, 19h56
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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