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 :

[9i]appelé 1 fonction en sql


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut [9i]appelé 1 fonction en sql
    bonsoir,

    voila mon probleme :

    j'ai créer une fonction et je voudrais l'appelée avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select F_MAJ_FLAGCEL('11111','toto@toto.com') FROM DUAL;
    mais j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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.
    dans la base il y a qu'un enregistrement celui qui corespond a "11111" ,hors si je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select F_MAJ_FLAGCEL('22222','toto@toto.com') FROM DUAL;
    il n'y a pas d'erreur (il ne ce passe rien mais il n'y a pas d'erreur)

    quelqu'un pourrait il m'aider?

    merci

  2. #2
    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
    La seule façon de vous aider serait d'avoir le code de la fonction qui doit utiliser des ordres du DML (Insert probablement)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    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
    CREATE OR REPLACE function f_maj_flagcel(
    in_refbp IN varchar,
    in_mail IN CHAR
    )
    return varchar IS
    vc_refbp number;
    vc_flagcel char;
    vc_mail varchar2(100);
    BEGIN
    	SELECT CLI_FLAGCEL into vc_flagcel FROM CLIENT WHERE CLI_REFBP = in_refbp;
    	SELECT CLI_MAIL into vc_mail FROM CLIENT WHERE CLI_REFBP = in_refbp;
    	IF ((vc_flagcel != 'v')AND(vc_flagcel != 'd'))
    	THEN
    		raise_application_error(-20002, 'Erreur de flagcel');
    	ELSE
    		IF (vc_flagcel = 'd')
    		THEN 		   	   
    		    UPDATE CLIENT SET CLI_FLAGCEL = 'v',CLI_MAIL = in_mail,CLI_DATE_VALIDATION = sysdate WHERE CLI_REFBP = in_refbp;	
    		    --raise ex_maj;
    		    return in_refbp;
    		ELSE
    			IF (vc_flagcel = 'v') 
    			THEN
    				UPDATE CLIENT SET CLI_MAIL = in_mail WHERE CLI_REFBP = in_refbp;
    				return in_refbp;
    			END IF;
    		END IF;
    	END IF;
    END;
    /

  4. #4
    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
    Vous ne pouvez pas utiliser une fonction qui met à jour la base de données dans une ordre Select.

    Essayez de passer votre fonction en AUTONOMOUS_TRANSACTION (en ajoutant une instruction commit avant chaque instruction Return)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE function f_maj_flagcel( 
    in_refbp IN varchar, 
    in_mail IN CHAR 
    ) 
    return varchar IS
    PRAGMA AUTONOMOUS_TRANSACTION ;
    ...
    ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 220
    Points : 70
    Points
    70
    Par défaut
    merci beaucoup, sa fonctionne maintenant, il me reste juste a regarder sur le net a quoi correspond tout sa

    encore merci

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

Discussions similaires

  1. Appeler une fonction pl/sql dans vb6
    Par pupucette dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2012, 16h55
  2. tester l'existence et appeler ma fonction en sql
    Par batou22003 dans le forum DB2
    Réponses: 0
    Dernier message: 25/07/2011, 18h01
  3. Faire appel à des fonctions MS SQL Server
    Par digital prophecy dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/12/2007, 22h06
  4. Réponses: 0
    Dernier message: 27/11/2007, 17h17
  5. problème appel à une fonction pl/sql
    Par tommey dans le forum Langage
    Réponses: 3
    Dernier message: 07/08/2007, 14h19

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