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 24/06/2008, 15h28   #1
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
Par défaut Pragma autonomous transaction

Bonsoir,
afin de detourner la fameuse j'ai crée une fonction qui me retoune le resultat d'un select sur la table "en mutation", et bien sur avec "pragma autonomous transaction" à l'interieur de cette fonction.
je n'ai plus d'erreur , sauf que la fonction ne s'execute pas, mais lorsque je mets
Code :
pragma autonomous transaction
en commentaire , la fonction est exceutée mais bien sur l'erreur remonte en face
ma question est la suivante : pourquoi , au niveau de la fonction, le code n'est pas executé lorsque
Code :
pragma autonomous transaction
y est ??
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 15h50   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Attends... où j'ai bien pu mettre ma boule de crystal... rhaaaa et le jeu de tarot...

Désolé, j'ai pas... faudra peut-être que tu nous donnes le code... enfin, sans vouloir te déranger hein
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h06   #3
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78

desolée LOL
voila ma fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION fct_return_idp(id_p VARCHAR2)
RETURN varchar2 IS
idp
varchar(20);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT id_personne INTO idp
FROM porteur WHERE Porteur.id_porteur = id_p;
 
RETURN id_p;
Exception
When
NO_DATA_FOUND Then RETURN NULL;
END;
et le trigger :
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
CREATE OR REPLACE TRIGGER TR_RemplirSMI_FromConso after UPDATE OR INSERT ON CONSOLIDATION FOR EACH ROW 
DECLARE  
tag VARCHAR(64);
 
codelogique VARCHAR(30);
 
existe number;
 
BEGIN 
 
SELECT champ INTO tag FROM porteur, supporte WHERE porteur.id_carte=supporte.id_carte AND Porteur.id_porteur=:new.id_porteur;
 
codelogique := fct_return_idp(:new.id_porteur);
 
codelogique := substr(codelogique,0,length(codelogique)-12)||substr(codelogique,-8,8);
 
SELECT count(tag) INTO existe FROM SMI WHERE tag = tag;
IF (:new.consolidation='CN') then 
 IF (existe<1) then 
INSERT INTO SMI  (codelogique,tag,exporter) VALUES (codelogique,tag,'0';
 else 
UPDATE SMI SET exporter = '0' WHERE tag = tag ;
 
end IF; 
end IF ;
Exception When NO_DATA_FOUND Then NULL;
 END;
et l'erreur :
Code :
la TABLE UNI.PORTEUR est en mutation ;
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h12   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212


Et pourquoi au lieu de :
Code :
1
2
3
4
5
6
 
SELECT champ INTO tag FROM porteur, supporte WHERE porteur.id_carte=supporte.id_carte AND Porteur.id_porteur=:new.id_porteur;
 
codelogique := fct_return_idp(:new.id_porteur);
 
codelogique := substr(codelogique,0,length(codelogique)-12)||substr(codelogique,-8,8);
tu ne fais pas :
Code :
SELECT champ,substr(id_personne,0,length(id_personne)-12)||substr(id_personne,-8,8) INTO tag,codelogique  FROM porteur, supporte WHERE porteur.id_carte=supporte.id_carte AND Porteur.id_porteur=:new.id_porteur;


C'est quoi l'intérêt de la fonction ?

Sinon, je te conseille de lire la doc de MERGE aussi
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h18   #5
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
la fct selectionne de la table porteur , cette table est en mutation , donc je crée la fct contenant la pragma
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h22   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Le pragma autonomous transaction ne peut pas résoudre le problème de la « table en mutation ». Le problème de la table en mutation est un bug de développement et non pas d’Oracle.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h30   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par zaineb.z Voir le message
la fct selectionne de la table porteur
mais tu l'as déjà dans le trigger la sélection de porteur... t'as lu ma proposition ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h49   #8
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
Bonjour,

Pour ta question originelle: le pragma autonomous cree une nouvelle session s2. Via cette session s2 tu essaies de lire des enregistrements non committés par s1 donc invisible pour s2. Comme tu as un when no_data_found then null, l'erreur ne se voit pas non plus.

Concernant le fond du probleme, je ne pense pas que ce soit ce trigger qui pose probleme. Il n'y a pas de modification de la table porteur(ou j'ai mal vu). Le select n'est pas bloquant donc pour moi, il y a un autre accès à la table.

Cdt
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h55   #9
Membre régulier
 
Inscription : juin 2007
Messages : 328
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 328
Points : 78
Points : 78
oui oui bien sur , mais cela ne résout pas mon problème , vu que la table porteur est en mutation ( trigger lancé lors de la modif de la table porteur , effectue des modifs ce qui declenchent le trigger sur lequel je travaille mnt )
zaineb.z est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 16h58   #10
Membre habitué
 
Inscription : février 2006
Messages : 139
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2006
Messages : 139
Points : 126
Points : 126
tu peux donner le sequencement des actions?
kervoaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2008, 17h01   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
si tu t'évertues à ne pas lire les réponses on ne peut rien pour toi
orafrance 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 17h59.


 
 
 
 
Partenaires

Hébergement Web