IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Procédure de mise à jour avec plusieurs tests


Sujet :

PL/SQL Oracle

  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux rajouter des AND dans les IF.. mais bon, ça reste des updates séparés pour tous les tests
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Merci beaucoup, j'avais pas pensé à la seconde solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Mise à jour de plusieurs colonnes avec foreach
    Par budiartaaa dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 09/11/2010, 22h53
  2. Réponses: 2
    Dernier message: 21/09/2009, 14h20
  3. [MySQL] Mise à jours de plusieurs lignes avec mysql
    Par hakou08 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/04/2009, 20h10
  4. Mise à jour de plusieurs tables
    Par NAMORJOSE dans le forum Access
    Réponses: 1
    Dernier message: 19/11/2005, 08h33
  5. Mise à jour avec jointure
    Par taupain dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/07/2004, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo