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 :

Update plusieurs Champs de Table avec un Record


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut Update plusieurs Champs de Table avec un Record
    Bonjour à Tous
    Je croyais avoir déja posé la question mais je ne la retrouve pas dans [Recherche]

    J'ai une fonction PL/SQL Qui me renvoit un Record (1 Char(2) et 1 Char(6))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FUNCTION Ma_FCT RETURNS RECORD
     Argument Name                  Type                    In/Out Default?
     ------------------------------ ----------------------- ------ --------
       V1_OUT                       CHAR(2)                 OUT
       V2_OUT                       CHAR(6)                 OUT
       V3_IN                        VARCHAR2                IN
       V4_IN                        VARCHAR2                IN
    J'ai ma Table T1 suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C1                                                 VARCHAR2(10)
     C2                                                 VARCHAR2(10)
     CC1                                                CHAR(2)
     CC2                                                CHAR(6)
    Est il possible de faire une requete directe de mise à jour de CC1 et CC2 avec le resultat de la fonction

    Quelque chose comme ce qui suit car le record renvoyé par "Ma_FCT" est en complete adequation avec (CC1 , CC2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Update T1 set (CC1,CC2) = Ma_FCT(C1,C2)
    Autrement dit : est il possible de faire une mise à jour des champs d'une table avec le contenu d'un RECORD correspondant au champs mis à jour ?

    de votre aide
    Signé : Capitaine Jean-Luc Picard

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Pour quelle version d'Oracle, capitaine ?

  3. #3
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Pour quelle version d'Oracle, capitaine ?
    oops désolé
    Signé : Capitaine Jean-Luc Picard

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Regarde Manipulating Records pour voir si ce n'est pas ça que tu cherche.

  5. #5
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Regarde Manipulating Records pour voir si ce n'est pas ça que tu cherche.
    Pas vraiment
    Mais si vous avez des infos permettant d'effectuer une mise à jour de plusieurs champs avec un records dans les versions supérieurs d'oracle (10g ou 11g) faites moi signe
    Signé : Capitaine Jean-Luc Picard

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Alors, peut être en employant les objets (klingoniene) Capitaine Picard.
    Quelque chose comme ça
    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
     
    create table t_testobj(
      c1 	varchar2(10) primary key,
      c2 	varchar2(10),
      cc1 	char(2),
      cc2	char(6)
    )
    /
    insert into t_testobj select empno, ename, SubStr(job,1,2), rownum from emp
    /
    Commit
    /
    create or replace Type testobj As object (
      cc1  char(2),
      cc2  char(6)
    );
    /
    create view v_testobj as select c1, c2, testobj(cc1,cc2) montyp from t_testobj
    /
    mni@DIANA> select * from t_testobj where c1 = 7844;
     
    C1         C2         CC CC2
    ---------- ---------- -- ------
    7844       TURNER     SA 10
     
    mni@DIANA> update v_testobj set montyp = testobj('AA','0') where c1 = 7844;
     
    1 ligne mise Ó jour.
     
    mni@DIANA> select * from t_testobj where c1 = 7844;
     
    C1         C2         CC CC2
    ---------- ---------- -- ------
    7844       TURNER     AA 0

  7. #7
    Membre actif
    Inscrit en
    Juillet 2007
    Messages
    357
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 357
    Points : 280
    Points
    280
    Par défaut
    heu j'ai pas de base sous la main et pas testé donc il doit y avoir 3 incoherence et 4 bugs dans ce que je propose mais un truc du style ca pourrait pas passer ??:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T1 SET (CC1,CC2) = (select V1,V2 from table( Ma_FCT(C1,C2))) f where T1.CC1 = f.V1

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    Oui, ta solution est faisable en passant par un objet (voir réponse de mnitu)et une table d'objet.

    En reprennant l'exemple de mnitu, il faut donc rajouter le type nécessaire et la fonction demandée par argoet qui doit alors retourner un objet (de type testobj):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace type tab_testobj is table of testobj;
    /
    create or replace function Ma_FCT (C1 in varchar2,
                                       C2 in varchar2) 
    return testobj
    is
    begin
      -- code ici
      return testobj('AA','0');
    end;
    /
    puis (toujours avec l'exemple de mnitu):
    UPDATE t_testobj SET (cc1, cc2) = (select cc1,cc2 from table(tab_testobj(Ma_FCT(C1,C2)))) where c1 = '7844';
    commit;

  9. #9
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    mnitu severn
    Merci à vous !!!
    ça marche Nickel Chrome
    je Tag
    Signé : Capitaine Jean-Luc Picard

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

Discussions similaires

  1. [HQL] Update HQL sur une table avec Id composite
    Par Eccoon dans le forum Hibernate
    Réponses: 5
    Dernier message: 02/04/2007, 12h10
  2. Insertion,update dans une BD à table avec beaucoup de champs
    Par randriano dans le forum C++Builder
    Réponses: 29
    Dernier message: 13/03/2007, 19h11
  3. [MySQL] Update plusieurs champs input
    Par xender dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/02/2007, 16h10
  4. Réponses: 6
    Dernier message: 05/04/2006, 11h12
  5. update d'après 2 tables avec ordre de date
    Par fred23195 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/12/2005, 17h39

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