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 20/12/2011, 08h58   #1
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Par défaut Procédure de mise à jour avec plusieurs tests

Bonjour,
Je dois effectuer une procédure de mise à jour de données en fonction de 4 paramètres qui seront remplis ou non.
Mon souci est que je pense utiliser une méthode loin d'être optimisé mais je ne trouve pas la solution.
Je passe 4 paramètres :
- nCo, nET et nAG qui permettent de sélectionner les enregistrements à mettre à jour
- nDa qui correspond à la date que je mettrai à jour.
Ma procédure
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
CREATE OR REPLACE  PROCEDURE "MODIFIER_INSCRIPTION"
     (
	nCo        IN varchar2,
	nDa        IN varchar2, -- sera toujours renseigné.
	nET	IN varchar2,
	nAG	IN varchar2
) IS
BEGIN
	IF(nAG IS NULL) then
		IF(nCo IS NULL) then
			IF(nET IS NULL) then
-- Raise_application_error(-20000,'Critère de sélection absent');
			else
			     UPDATE avec le test sur nET
			end IF;
		else
			IF(nEt IS NULL) then
			     UPDATE avec le test sur nCo
			else
			     UPDATE avec le test sur nET et nCo
			end IF;
		end IF;
	else
		IF(nCo IS NULL) then
			IF(nET IS NULL) then
			     UPDATE avec le test sur nAG
			else
			     UPDATE avec le test sur nAG et nET
			end IF;
		else
			IF(nEt IS NULL) then
			     UPDATE avec le test sur nAG et nCo
			else
			     UPDATE avec le test sur nAG, nET et nCo
			end IF;
		end IF;
	end IF;
Je pense que je fais bien trop de if else end if.
Pouvez-vous m'indiquer l'instruction qui pourrait m'aider s'il vous plait?
Cordialement
Pinocchio
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 10h02   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Tu peux rajouter des AND dans les IF.. mais bon, ça reste des updates séparés pour tous les tests
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
38
CREATE OR REPLACE  PROCEDURE "MODIFIER_INSCRIPTION"
     (
	nCo        IN varchar2, 
  nDa        IN varchar2, -- sera toujours renseigné.
	nET	IN varchar2, nAG	IN varchar2
) 
IS
BEGIN
 
	IF nAG IS NULL AND nCo IS NULL AND nET IS NULL
  THEN
		RAISE_APPLICATION_ERROR(-20000,'Critère de sélection absent');
  END IF;
 
  IF nAG IS NULL AND nCo IS NULL AND nET IS NOT NULL
  THEN
  	UPDATE avec le TEST sur nET
  ELSIF nAG IS NULL AND nCo IS NOT NULL AND nET IS NOT NULL
  THEN
  	UPDATE avec le TEST sur nET et nCo
  ELSIF nAG IS NULL AND nCo IS NOT NULL AND nET IS NULL
  THEN
  	UPDATE avec le TEST sur nCo
	ELSIF nAG IS NOT NULL AND nCo IS NULL AND nET IS NULL
  THEN
  	UPDATE avec le TEST sur nAG
  ELSIF nAG IS NOT NULL AND nCo IS NULL AND nET IS NOT NULL
  THEN
  	UPDATE avec le TEST sur nAG et nET
  ELSIF nAG IS NOT NULL AND nCo IS NOT NULL AND nET IS NULL
  THEN
  	UPDATE avec le TEST sur nAG et nCo
  ELSE --nAG, nCo, nET NOT NULL 
  THEN
  	UPDATE avec le TEST sur nAG, nET et nCo
  END IF;
 
END;
Le mieux est bien sur de faire un seul update avec prise en compte des valeurs nulles des paramètres.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
IF nAG IS NULL AND nCo IS NULL AND nET IS NULL
  THEN
		RAISE_APPLICATION_ERROR(-20000,'Critère de sélection absent');
  END IF;
 
 -- Si les colx sont not null
 UPDATE XXX
 SET ...
 WHERE col1 = NVL(nAG, col1)
 AND col2 = NVL(nCo, col2)
 AND col3 = NVL(nET, col3)
 
 -- Si les colx peuvent être NULL
 UPDATE XXX
 SET ...
 WHERE (col1 = nAG OR nAG IS NULL)
 AND (col2 = nCo OR nCo IS NULL)
 AND (col3 = nET OR nET IS NULL)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/12/2011, 10h08   #3
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Merci beaucoup, j'avais pas pensé à la seconde solution.
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio 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 20h25.


 
 
 
 
Partenaires

Hébergement Web