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 :

[oracel 9i] %rowtype et insert into


Sujet :

Oracle

  1. #1
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut [oracel 9i] %rowtype et insert into
    Bonjour, j'ai une table avec bcp de champs.
    Est il possible d'utiliser en PL/SQL le %rowtype afin de pas saisir le nom de chaque champs dans l'instruction insert into

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    declare
     wmarow	matable%rowtype;
     
    begin
    	 wmarow.champs1 := sysdate;
     
    	 insert into matable
    	 select wmarow from dual;
    end;
    Je trouve pas la syntaxe est ce que c'est possible ?

  2. #2
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    à mon avis, du moment que tu fait un insert sur la non-totalité des colonnes, tu es obligé de les déclarer...

    euuuh de plus tu fais ici une fonction sans clause return... ici je pense qu'une procédure serais plus appropriée
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  3. #3
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Citation Envoyé par Yorglaa
    à mon avis, du moment que tu fait un insert sur la non-totalité des colonnes, tu es obligé de les déclarer...
    Je suis d'accord sur le principe de non-totalité des colonnes cependant connais tu une syntaxe sr on opere sur la totalité des colonnes cat je tourne enronds là et je trouve pas dans la doc ORACLE

    Citation Envoyé par Yorglaa
    euuuh de plus tu fais ici une fonction sans clause return... ici je pense qu'une procédure serais plus appropriée
    Je suis d'accord unprocédure serait mieux, cependant le code est un bout d'exemple.


    PS : J'AI MODIFIE LE CODE

  4. #4
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    et bien si tu opère sur la totalité de tes colonnes, tu peux faire soit un insert simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into maTable
    Values ( 
                  1
                , 'bonjour'
                , Null
                , 2564
                , 'adresse'
    etc... 
           )
    autant de valeurs que de colonnes en laissant à "NULL" les colonnes que tu ne veux pas remplir, et tu dois alors donner les valeurs dans l'ordre où
    sont les colonnes de la table.

    sinon un Insert-Select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Insert into maTable
    Select
              id
              , nom
              , NULL
              , no_compte
    Etc...
    From
              Tables du Select
    Where
              jointures, clauses, etc...
    là aussi, le Select doit ramener autant de colonnes qu'il y en a dans la table à remplir... quitte à mentionner des colonnes comme NULL dans le Select.

    Attention, les types de données doivent bien entendu correspondre...

    voilà, j'espère que ça t'aide


    PS dans ton code modifié il manque le DECLARE
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    et n'oublie pas le(s) Commit(s) pour valider ta (tes) transaction(s) !!
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  6. #6
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Ok, je suis d'accord avec toi sur l'utilisation du insert.

    Ce que je voudais dire, c'est comment en faire de même (ne pas tapper les noms de champs) dans le select, mais utiliser la varaible de %rowtype.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Utilisation de tous les champs de la table'
    insert into matable
    values(wmarow.champs1,wmarow.champs2,wmarow.champs3,......)
    Je ne souhaite pas faire le
    wmarow.champs1,wmarow.champs2,wmarow.champs3,......

    J'espere tourver une truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Utilisation de tous les champs de la table'
    insert into matable
    values(wmarow)
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Utilisation de tous les champs de la table'
    insert into matable
    select wmarow from dual
    ou je ne sais quoi, comme ça ORACLE mappe les champs de la tabel maTable avec les champs de la variable wmarow qui est de type maTable%rowtype.

    Je suis pas sur d'avoir expliquer correctement ce que je souhaite en fait.

    PS : Declare rajouté merci

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    alors d'après les tests que j'ai fait non...

    tu dois forcément faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_variable_rowtype.ma_colonne
    mais je n'ai pas la science infuse... si quelqu'un a mieux... Welcome !

    peut-être en créant et utilisant des types complexes personnalisés ? je vais essayer cet après-midi si j'ai le temps...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  8. #8
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Sinon il faut créer un fonction qui retourne l'ordre sql tou formaté.
    car on connait
    le nom de la table
    le nom de la variable
    et les champs de la table sont dans all_tab_columns.

    Mais cette facon ne me convint pas j'avoue, bon si personne je vais tapper les nom de colonnes

    merci qd même

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    En 9i, c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table test_RowType (coldate DATE, ColNumber NUMBER);
     
    DECLARE
       v_MyRow Test_RowType%ROWTYPE;
    BEGIN
      v_MyRow.ColDate   := SysDate;
      v_MyRow.Colnumber := 100;
     
      INSERT INTO Test_RowType VALUES v_MyRow;
    END;
    /
    mais en 8i, c'est pas possible, il faut préciser toutes les colonnes...

    NB : En 9i, la clause VALUES doit être appellée sans les parenthèses...

  10. #10
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    merci du tuyaux !!!

    c'est traître le coup des parenthèses...

    mais merci !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  11. #11
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Traitre ? oui et non...

    Oui, parce qu'on est habitué à utilisé values avec des parenthèses, mais c'est tout ce qu'il y a de plus logique puisque les parenthèses servent à définir une liste alors que là, justement, on ne souhaite pas utiliser de liste mais une seule variable...

  12. #12
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Super merci bcp.

    En fait c'est tout à fait logique mais fallait y penser !!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/10/2006, 14h28
  2. probleme clé sequentiel avec insert into
    Par shake dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2004, 15h54
  3. probleme d'INSERT INTO et JavaScript
    Par Matlight dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/03/2004, 15h36
  4. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38
  5. Insert Into + Date
    Par BoeufBrocoli dans le forum SQL
    Réponses: 10
    Dernier message: 13/08/2003, 11h23

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