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

 Oracle Discussion :

meilleure solution pour une procédure update


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut meilleure solution pour une procédure update
    Salam

    Je travail sur un projet sous oracle, et je suis mené à écrire des procédures d'ajout de suppression et de modification. pour l'ajout et la suppression tout s'est bien passé, maintenant je cherche la meilleure solution pour écrire la procédure de modification vu que je vais modifier un seul champ à la fois, est ce que j'ai besoin d'ecrir une procédure de modification pour chaque champ de chaque table ou bien y a une autre solution, merci

    j'espère que c'est claire

  2. #2
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Salam,

    Je pense que j'ai pas très bien compris ton problème. Tu parles bien de procedure ou tu veux dire trigger?

    Un trigger est un "bout de code" qui sera exécuté à certains moments que tu défini (par exemple la mise à jour d'un champ d'une table).

    Une procédure est un bout de code qui exécute un certain traitement (par exemple supprimer des enregistrements dans une table).

    Peux-tu nous donner plus de détails par rapport à ton problème ?

    Merci d'avance,

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Merci OracleFan pour le réponse

    je vais essayer avec un exemple

    j'ai une table client avec 4 champs, num_client, nom_client, adresse_client, tel_client.

    maintenant, j'aimerai écrire une procédure d'Update, suis je obligé d'ecrire 4 procédures la 1ère pour faire un update de (nom_client, adresse_client, tel_client)
    2ème pour un update de (nom_client) seulement,
    3ème : update (adresse_client) seulement,
    et une dérnière pour update(tel_client) seulement.
    j'aimerai trouvé une solution plus simple pour regroupé les 3 dernières procédures, par exemple je passe juste le champs à modifier, et la nouvelle valeur. car dans le cas d'une table avec une dizaine de champs ça devient un peu lourd à écrire et je me suis dis il doit y avoir une solution plus simple et plus propre pour faire.

    c'est plus claire??

  4. #4
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Hello Zikas-r,

    J'ai toujours du mal à comprendre... Qu'est ce que tu entends par procédure ? Un bout de code qui ressemble à ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE OR REPLACE PROCEDURE ma_procedure(param IN VARCHAR2) AS
    BEGIN
     
    END;
    Si tu as une table CLIENTS qui contient 4 champs(numero, nom, adresse et téléphone), tu peux faire un update pour mettre à jour cette table client. Si tu veux mettre à jour le nom du client tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE CLIENTS 
       SET NOM = 'valeur'
     WHERE ... /* pour trouver le ou les enregistrements à modifier.*/
    Si tu veux modifier plusieurs champs, par exemple nom, numero, adresse, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE CLIENTS
      SET NOM = 'valeur', 
          NUMERO = 123, 
          ADRESSE = '123 rue de la rue'
     WHERE ... /* pour trouver le ou les enregistrements à modifier.*/
    Personnellement, je ne comprend pas l'utilité d'avoir une procédure pour mettre à jour un enregistrement. Mais bon, peut-être j'ai mal saisi. Alors, moi, à ta place, je ferai un code qui ressemble à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE PROCEDURE ma_procedure(p_nom IN VARCHAR2 DEFAULT NULL, p_numero IN VARCHAR2 default NULL, p_adresse in VARCHAR2 default NULL, p_telephone in Varchar2 default null) AS
    BEGIN
     
      UPDATE CLIENTS SET
             NOM = p_nom, 
          NUMERO = p_numero, 
          ADRESSE = p_adresse, 
        TELEPHONE = p_telephone
     WHERE ... /* pour trouver le ou les enregistrements à modifier.*/
    END;
    Tu peux appeler cette procédure sans paramètre, avec un paramètre, etc.

    Tu peux m'expliquer pourquoi tu fais des procedures pour mettre à jour tes tables et tu ne passes pas tout simplement par un UPDATE statement ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut Une seule procédure
    Salut Zikas-r,

    Une possibilité est de n'écrire qu'une seule procédure à 4 paramètres et ne ne prendre en compte que les paramètres non null.

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure client_maj (
      pn_num_client in client.num_client%type, -- Numero du client à mettre à jour
      ps_nom_client in client.nom_client%type default null, -- Nouveau nom du client (null si identique)
      ps_adresse_client in client.adresse_client%type default null, -- Nouvelle adresse (null si identique)
      ps_tel_client in client.tel_client%type default null -- Nouveau tel (null si identique)
    Is
    Begin
      Update client Set
      nom_client = nvl(ps_nom_client, nom_client),
      adresse_client = nvl(ps_adresse_client, adresse_client),
      tel_client = nvl(ps_tel_client, tel_client)
    Where num_client = pn_num_client;
    End client_maj;
    Et ça s'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_maj(4, 'Durant épouse dupond', '1 rue gal degol', '0102030405');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_maj(4, 'Durant épouse dupond');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client_maj(num_client => 4, tel_client => '0102030405');
    Pozzo

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Pozzo, OracleFan Merci pour vos réponse.

    @OracleFan : je suis obligé de passer par des procédures (en faite c'est une procédure stocké), c'est pas encore claire dans ma tête, vu que je viens de commencé. je savais pas que je peux faire appele à une procédure sans paramètre ou juste avec un paramètre. comment t'as dit, Merci bcp pour ton aide.

    @Pozzo : je crois que c'est bien ça, j'ai testé, mais je crois que je fait une erreur quelque part, voila mon code :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    create or replace
    PROCEDURE modifier_bien
     (v_NUMBIEN IN bien.numbien%TYPE, 
      v_DESCRIPTIONBIEN IN bien.descriptionbien%TYPE                	   default NULL,
      v_NUMRUEBIEN IN bien.NUMRUEBIEN%TYPE       			   default NULL,
     	v_NOMRUEBIEN IN bien.NOMRUEBIEN%TYPE         		           default NULL,
     	v_CODEPOSTALEBIEN IN bien.CODEPOSTALEBIEN%TYPE	     		   default NULL,
    	v_VILLEBIEN IN bien.VILLEBIEN%TYPE	     		           default NULL,
    	v_SURFACEHABITABLEBIEN IN bien.SURFACEHABITABLEBIEN%TYPE	   default NULL,
    	v_SURFACETERRAINBIEN IN bien.SURFACETERRAINBIEN%TYPE	           default NULL,
    	v_CAVEBIEN IN bien.CAVEBIEN%TYPE	      			   default NULL,
    	v_GARAGEBIEN IN bien.GARAGEBIEN%TYPE	    			   default NULL,
    	v_NBRPIECEMAISON IN bien.NBRPIECEMAISON%TYPE	  		   default NULL,
    	v_NBRETAGEMAISON IN bien.NBRETAGEMAISON%TYPE	     		   default NULL,
    	v_JARDINMAISON IN bien.JARDINMAISON%TYPE	      		   default NULL,
    	v_DESCRIPTIONAPPARTEMENT IN bien.DESCRIPTIONAPPARTEMENT%TYPE	   default NULL,
    	v_NBRPIECEAPPARTEMENT IN bien.NBRPIECEAPPARTEMENT%TYPE	       	   default NULL,
    	v_BALCONAPPARTEMENT IN bien.BALCONAPPARTEMENT%TYPE	           default NULL,
    	v_ASCENSEURAPPARTEMENT IN bien.ASCENSEURAPPARTEMENT%TYPE	   default NULL,
    	v_NUMETAGEAPPARTEMENT IN bien.NUMETAGEAPPARTEMENT%TYPE	           default NULL,
    	v_PLACESTATIONNEMENT IN bien.PLACESTATIONNEMENT%TYPE	           default NULL)
    IS
    BEGIN
            UPDATE BIEN 
    	SET  DESCRIPTIONBIEN = nvl(v_DESCRIPTIONBIEN, DESCRIPTIONBIEN),
    	NUMRUEBIEN = nvl(v_NUMRUEBIEN, NUMRUEBIEN),
    	NOMRUEBIEN = nvl(v_NOMRUEBIEN, NOMRUEBIEN),
    	CODEPOSTALEBIEN = nvl(v_CODEPOSTALEBIEN, CODEPOSTALEBIEN),
            VILLEBIEN = nvl(v_VILLEBIEN, VILLEBIEN),
    	SURFACEHABITABLEBIEN = nvl(v_SURFACEHABITABLEBIEN, SURFACEHABITABLEBIEN),
    	SURFACETERRAINBIEN = nvl(v_SURFACETERRAINBIEN, SURFACETERRAINBIEN),
    	CAVEBIEN = nvl(v_CAVEBIEN, CAVEBIEN),
    	GARAGEBIEN = nvl(v_GARAGEBIEN, GARAGEBIEN),
    	NBRPIECEMAISON = nvl(v_NBRPIECEMAISON, NBRPIECEMAISON),
    	NBRETAGEMAISON = nvl(v_NBRETAGEMAISON, NBRETAGEMAISON),
    	JARDINMAISON = nvl(v_JARDINMAISON, JARDINMAISON),
    	DESCRIPTIONAPPARTEMENT = nvl(v_DESCRIPTIONAPPARTEMENT, DESCRIPTIONAPPARTEMENT),
    	NBRPIECEAPPARTEMENT = nvl(v_NBRPIECEAPPARTEMENT, NBRPIECEAPPARTEMENT),
    	BALCONAPPARTEMENT = nvl(v_BALCONAPPARTEMENT, BALCONAPPARTEMENT),
    	ASCENSEURAPPARTEMENT = nvl(v_ASCENSEURAPPARTEMENT, ASCENSEURAPPARTEMENT),
    	NUMETAGEAPPARTEMENT = nvl(v_NUMETAGEAPPARTEMENT, NUMETAGEAPPARTEMENT),
    	PLACESTATIONNEMENT = nvl(v_PLACESTATIONNEMENT, PLACESTATIONNEMENT)
    	WHERE bien.numbien = v_NUMBIEN;
    	IF SQL%NOTFOUND THEN
      		RAISE_APPLICATION_ERROR(-20202,'Pas de bien modifié.');
    	ELSE
     		COMMIT;
      END IF;
    END modifier_BIEN ;
    Supposant que je veux juste modifier le nombre des pièces de l'appart ET GARDER LES AUTRES CHAMPS, j'ai fait appel à ma procédure comme suit : (mais)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> execute modifier_bien(numbien=>2, NBRPIECEAPPARTEMENT=>3);
    BEGIN modifier_bien(numbien=>2, NBRPIECEAPPARTEMENT=>3); END;
     
          *
    ERROR at line 1:
    ORA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'MODIFIER_BIEN'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Pozzo, OracleFan, je vous remercie infiniment, maintenant ça marche nickel.
    le problème c'est que je me suis trompé dans l'appel des le procédure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL> execute modifier_bien(v_numbien => 2, v_NUMETAGEAPPARTEMENT => 10);
     
    PL/SQL procedure successfully completed.
    j'ai une autre question , y a une façon pour faire des GET de la même manière ?? par exemple une GET qui regroupe (get_nomclient(numc_client), get_adresseclient(num_client), get_telclient(numclient) ...) ??

    je passe le topic à resolu

  8. #8
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Hello Zikas-r,

    Ce que tu demandes n'est pas censé. Je ne comprend pas l'utilité de faire ce que tu demandes, mais il existe dans Oracle des "procédures qui renvoient des valeurs"... C'est ce qu'on appelle des fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE OR REPLACE FUNCTION ma_fonction(...) RETURN VARCHAR2 AS
    BEGIN
    END;
    La fonction aura TOUJOURS le même type de retour. Donc, tu ne saurais pas créer des "getters" qui retourne un type différent (genre retourner un nomber dans un certain cas et une chaine de caractère ou une date dans un autre cas).

    Je suis sur que si tu expliquait ton problème, nous pourrons t'aider à structurer ton travail et tes packages/fonctions/procédure/triggers.

    Bien à toi,

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 260
    Points : 281
    Points
    281
    Par défaut Utiliser un record
    Salut,

    En utilisant une fonction il y a une possibilité en complexifiant un peu l'organisation du code.

    On peut utiliser un package dédié à la gestion de client.

    Il est composé de :
    - Un type lr_client de type record qui mappe client
    - Une procedure set (fait)
    - Une fonction set qui retourne le type (à faire)

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Create or replace package client as
    -- Support de la table client
     
    type pkr_client is record (
      num_client client.num_client%type, 
      nom_client IN client.nom_client%type,
      adresse_client IN client.adresse_client%type,
      tel_client IN client.tel_client%type);
     
    -- Le code de la fonction get_client qui accepte en paramètre pn_num_client et retourne  
    -- en résultat pr_client n'est pas très difficile à imaginer.
    function client_get (pn_num_client in client.num_client%type) return pkr_client;
    Ensuite on peut depuis un autre programme appelant :
    1 Déclarer une srtuture d'accueil
    lr_client client.pkr_client;
    2 Valoriser cette structure avec la fonction
    lr_client := client.get_client(mon_numéro_de_client);
    3 Utiliser un attribut seulement
    lf lr_client.tel_client = ...

    Pozzo

  10. #10
    Membre habitué
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 132
    Points
    132
    Par défaut
    Hello Pozzo,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT num_client, nom_client
    FROM clients 
    WHERE num_client = :pNumClient
    En SQL, il n'est pas intéressant d'avoir des getters et des setters sur toutes les tables... Une table n'est pas un (Java-)bean!

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 10/07/2015, 16h58
  2. Réponses: 4
    Dernier message: 04/02/2010, 08h15
  3. Réponses: 12
    Dernier message: 12/10/2009, 14h21
  4. [MySQL] meilleure solution pour alimenter une bdd mysql
    Par Zikas-r dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/02/2009, 14h55
  5. Réponses: 4
    Dernier message: 25/11/2008, 13h03

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