Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 28/12/2006, 17h44   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 12
Points : 12
Par défaut Probleme avec le resultat d'un SELECT

Bonjour,
voila mon probleme:
je voudrais récuperer le resultat d'un select et pouvoir tester s'il contient une valeur ou non!!!

voila un bout du programme en question:
Code :
1
2
3
4
5
6
 
SELECT vendues INTO tmp FROM statvol 
WHERE idist = 90;
IF tmp IS NULL then
INSERT INTO statvol VALUES(90,1,1,1);
.....
je vous remercie d'avance.
gama2ee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 18h34   #2
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Declare 
  tmp varchar2(512) ; -- ou number , boolean etc ..
begin
   SELECT vendues INTO tmp 
   FROM statvol
   WHERE idist = 90;
Exception 
   when NO_DATA_FOUND then   -- aucun enregistrement trouvé 
      INSERT INTO statvol ( mieux vaut ici nommer les colonnes ) VALUES(90,1,1,1);
    when TO_MANY_ROWS then  -- plusieurs lignes trouvées 
       null;
     when OTHERS then
       dbms_output.put_line ( SQLCODE ||' : ' || SQLERRM );
End;

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 20h00   #3
Membre actif
 
Avatar de VinceTlse
 
Inscription : janvier 2005
Messages : 163
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2005
Messages : 163
Points : 163
Points : 163
Code :
1
2
3
INSERT INTO statvol VALUES(90,1,1,1)
WHERE NOT EXISTS (SELECT NULL FROM statvol
WHERE idist = 90);
__________________
Pourquoi faire aujourd'hui ce que l'on peut faire demain ...
VinceTlse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2006, 22h51   #4
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
T'es sur de toi VinceTlse ? Tu n'utilise nulle part statvol.vendues et il me semble que c'est ça qui doit être égal à null pour déclencher l'insertion...
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2006, 09h13   #5
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
Sinon, il y a MERGE qui le fait très bien
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 16h16   #6
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 12
Points : 12
je vous remercie pour vous réponse, mais j'ai toujours un problème avec le resultat.

voila le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
CREATE OR REPLACE TRIGGER stat
AFTER UPDATE OF pldispo ON vols
FOR EACH ROW
DECLARE 
tmp NUMBER;
mo  NUMBER;
an  NUMBER;
BEGIN
mo := to_char(:new.dates,'mm') ;
an := to_char(:new.dates,'yy') ;
SELECT vendues INTO tmp
FROM statvol 
   WHERE :new.idist = idist AND mo = mois AND an = annee;  
Exception 
   when NO_DATA_FOUND then   
      INSERT INTO statvol VALUES(:new.idist,1,mo,an);
   when TOO_MANY_ROWS then  
       UPDATE statvol SET vendues  = vendues + 1
       WHERE  mo = mois AND an = annee AND :new.idist = idist;
...
end;
/
mon problème c'est même dans le cas ou il doit exister une ligne de resultat, il ne passe pas dans le TOO_MANY...
gama2ee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 17h08   #7
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
Citation:
une ligne de resultat, il ne passe pas dans le TOO_MANY.
S'il n'existe qu'une ligne , l'exception TOO_MANY_ROWS n'est pas déclanchée ( ce qui peut parraitre normal > TOO_MANY_ROWS := trop de lignes ...)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
....
begin
SELECT vendues INTO tmp
FROM statvol
where :new.idist = idist AND mo = mois AND an = annee;
/* Insérer ici le traitement à effectuer si UNE ligne est retournée*/
-- traitement UNE ligne 
Exception
when NO_DATA_FOUND then
-- Ici le code du traitement si aucune ligne n'est retournée 
when TOO_MANY_ROWS then
-- Ici le code du traitement si plusieurs lignes sont retournées par le SELECT...
end;

http://sheikyerbouti.developpez.com/...=Chap1#L1.2.20

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2007, 13h03   #8
Membre expérimenté

 
Inscription : décembre 2003
Messages : 480
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 480
Points : 539
Points : 539
ATTENTION

utiluiser du code logique dans des exceptions, c'est peut-être correct au niveau fonctionnement mais pour la maintenance applicative ...

les exceptions c'est pour les exceptions ; pas pour un traitement "normal"

il faut aussi penser à la lisibilité du code !
__________________

*** OPN Exadata Specialist ***
*** OCE Performance Tuning 11g ***
*** OCE Rac 10g ***
*** OCP DBA 9i-10g-11g ***
Marc Musette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2007, 11h14   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Tu peux aussi
- faire l'update
- tester le SQL%ROWCOUNT (variable système indiquant le nombre de ligne modifiée)
- et si ce nombre est 0, faire l'insert.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2007, 22h37   #10
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 40
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 40
Points : 12
Points : 12
bonsoir,
finalement j'ai fait la selection et puis directement l'update et donc dans le cas ou l'exception me ramene NO_DATA_FOUND je fait l'INSERT.
gama2ee est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 10h12   #11
Membre expérimenté

 
Inscription : décembre 2003
Messages : 480
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 480
Points : 539
Points : 539
si c'est résolu, mettre le tag RESOLU . merci
__________________

*** OPN Exadata Specialist ***
*** OCE Performance Tuning 11g ***
*** OCE Rac 10g ***
*** OCP DBA 9i-10g-11g ***
Marc Musette est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h19.


 
 
 
 
Partenaires

Hébergement Web