Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 12/10/2007, 13h46   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 6
Points : 3
Points : 3
Par défaut update avec Case et PL/SQL

Bonjour,
J'ai besoin de faire un update avec des conditions:

la syntaxe suivante marche sans probleme en sql:
Code :
1
2
3
4
5
6
7
8
UPDATE matable
SET VALEUR_DONNEE=
CASE 
    WHEN REALISE_CDI1 IS NOT NULL AND REALISE_CDI2 IS NOT NULL THEN REALISE_CDI1+REALISE_CDI2
    WHEN REALISE_CDI1 IS NOT NULL AND REALISE_CDI2 IS NULL THEN REALISE_CDI1
    WHEN REALISE_CDI1 IS NULL AND REALISE_CDI2 IS NOT NULL THEN REALISE_CDI2
    ELSE REALISE
END
Mais dès que je l'utilise en pl/sql (en rajoutant un BEGIN/END sous sqldevelopper ou en voulant compiler un package pl/sql) j'ai le message d'erreur suivant: (la ligne 5 correspond au case)
Citation:
ORA-06550: Ligne 5, colonne 1 :
PLS-00103: Symbole "CASE" rencontré à la place d'un des symboles suivants :

( - + mod null <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current max min prior sql stddev sum variance execute
forall time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string>
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
Comment utiliser le case avec du pl? ou bien faire qque chose de similaire?
ma version:
Oracle8i Enterprise Edition 8.1.7.4.1
PL/SQL 8.1.7.4.0
-Mapk- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 13h55   #2
Invité de passage
 
Inscription : octobre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 6
Points : 3
Points : 3
j'ai resolu mon probleme, il fallait simplement mettre un 'execute immediate' ...
-Mapk- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 14h10   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
C'est bizarre que ça marche en execute immediate et pas en compilation.
Essaye d'éviter le execute immediate qui est moins performant qu'un code compilé.

Chez moi en pl, le update = case marche bien.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 15h45   #4
Invité de passage
 
Inscription : octobre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 6
Points : 3
Points : 3
ok, je veux bien essayé de l'éviter mais sans, ca ne marche pas... est-ce du à la version??
-Mapk- est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 16h17   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Ma faute, j'avais pas vu que tu avais donné ta version.
J'ai pu tester sur une 8.1.7, effectivement, en pl, ça marche pas.

Tu dois pouvoir le faire avec un decode
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 16h22   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Voici les équivalences :
Code :
1
2
3
4
5
WHEN realise_cdi1 IS NOT NULL AND realise_cdi2 IS NOT NULL 	THEN realise_cdi1+realise_cdi2
WHEN realise_cdi1 IS NOT NULL AND realise_cdi2 IS NULL 		THEN realise_cdi1
WHEN realise_cdi1 IS NULL 	  AND realise_cdi2 IS NOT NULL 	THEN realise_cdi2
ELSE realise
END
Code :
1
2
3
4
DECODE(realise_cdi1, NULL, 
		DECODE(realise_cdi2, NULL, realise, realise_cdi2),
		DECODE(realise_cdi2, NULL, realise_cdi1, realise_cdi1 + realise_cdi2)
		)
Code :
1
2
3
4
DECODE(realise_cdi1, NULL, 
		NVL(realise_cdi2, realise),
		realise_cdi1 + NVL(realise_cdi2,0)
		)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2007, 16h32   #7
Invité de passage
 
Inscription : octobre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 6
Points : 3
Points : 3
ok merci!
-Mapk- 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 15h25.


 
 
 
 
Partenaires

Hébergement Web