Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/01/2008, 17h02   #1
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Par défaut Problème DML dans fonction

Bonjour, j'ai une erreur dml quand je veux exécuter cette fonction, quelqu'un pourrais m'aider, merci :

select portail.resilier.AJOUTERRESILIATIONCONTACT(1406968, 2, 'Machin', 'Machin', '654', 22, to_date('03/01/2008', 'DD/MM/YYYY'), 2, to_date('11/05/2646', 'DD/MM/YYYY'), NULL, 9) from dual


Code :
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
FUNCTION ajouterresiliationcontact (
      p_expuid                 IN   resiliation_contact.expuid%TYPE,
      p_id_civilite            IN   resiliation_contact.id_civilite%TYPE,
      p_nom                    IN   resiliation_contact.nom%TYPE,
      p_prenom                 IN   resiliation_contact.prenom%TYPE,
      p_numero_telephone       IN   resiliation_contact.numero_telephone%TYPE,
      p_id_choix_resiliation   IN   resiliation_contact.id_choix_resiliation%TYPE,
      p_date_demande           IN   resiliation_contact.date_demande%TYPE,
      p_type_date_appel        IN   resiliation_contact.type_date_appel%TYPE,
      p_date_appel             IN   resiliation_contact.date_appel%TYPE,
      p_jour_appel             IN   resiliation_contact.jour_appel%TYPE,
      p_heure_appel            IN   resiliation_contact.heure_appel%TYPE
   )
      RETURN resiliation_contact.id_contact%TYPE
   IS
      l_id_contact   resiliation_contact.id_contact%TYPE;
   BEGIN
      SELECT s_resil_contact.NEXTVAL
        INTO l_id_contact
        FROM DUAL;
 
      INSERT INTO resiliation_contact
                  (id_contact, expuid, id_civilite, nom, prenom,
                   numero_telephone, id_choix_resiliation,
                   date_demande, type_date_appel, date_appel,
                   jour_appel, heure_appel
                  )
           VALUES (l_id_contact, p_expuid, p_id_civilite, p_nom, p_prenom,
                   p_numero_telephone, p_id_choix_resiliation,
                   p_date_demande, p_type_date_appel, p_date_appel,
                   p_jour_appel, p_heure_appel
                  );
 
      COMMIT;
 
      RETURN l_id_contact;
   END;
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h06   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par Z3phur Voir le message
Bonjour, j'ai une erreur dml quand je veux exécuter cette fonction, quelqu'un pourrait m'aider, merci :
ça serait bien d'avoir le message d'erreur, non ?
Il n'y aurait pas un problème d'initialisation de la séquence des fois ?
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h07   #3
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Voici l'erreur :

ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "PORTAIL.RESILIER", line 118

cela se passe lors de l'insert
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h10   #4
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
Citation:
Envoyé par Z3phur Voir le message
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "PORTAIL.RESILIER", line 118
Ah ben, oui, tu fais un select pour tester ta fonction qui fait un insert et Oracle ne veut et ne peut pas.

Essaie-ça dans sql+ :
Code :
1
2
3
4
begin
portail.resilier.AJOUTERRESILIATIONCONTACT(1406968, 2, 'Machin', 'Machin', '654', 22, to_date('03/01/2008', 'DD/MM/YYYY'), 2, to_date('11/05/2646', 'DD/MM/YYYY'), NULL, 9);
end;
/
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h16   #5
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
Comme je ne connaissais pas la réponse ->google -> il me renvoit sur developpez.net:

[Pl/Sql] Insert ou Update dans une fonction

de façon synthétique à moins d'utiliser pragma autonomous_transaction tu ne peux pas utiliser d'INSERT dans une fonction.
phili_b est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h18   #6
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Merci pour vos réponses rapides
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 17h43   #7
Membre chevronné
 
Avatar de Z3phur
 
Homme loic
Administrateur de base de données
Inscription : décembre 2007
Messages : 673
Détails du profil
Informations personnelles :
Nom : Homme loic
Âge : 37
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie

Informations forums :
Inscription : décembre 2007
Messages : 673
Points : 773
Points : 773
Merci voici une solution qui marche très bien pour tester ma fonction en laissant l'insert à l'intérieur.


Code :
1
2
3
4
5
6
7
8
declare
v integer;
begin
 
v:= resilier.AJOUTERRESILIATIONCONTACT(1406968, 2, 'Machin', 'Machin', '654', 22, to_date('03/01/2008', 'DD/MM/YYYY'), 2, to_date('11/05/2646', 'DD/MM/YYYY'), NULL, 9);
dbms_output.put_line(v);
end;
/
Z3phur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2008, 18h14   #8
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
oups, effectivement, j'avais omis de capter la valeur de retour...
Mon code était bon pour une procédure, pas pour une fonction...
Mea culpa
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h55.


 
 
 
 
Partenaires

Hébergement Web