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 :

Remplir plusieurs variables ROWTYPE en 1 select


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut Remplir plusieurs variables ROWTYPE en 1 select
    Bonjour à tous,

    Sous Oracle 10g, je n'arrive pas à exécuter ceci :

    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
     
    create or replace PROCEDURE TEST AS
      A  TABLE_A%ROWTYPE;
      B  TABLE_B%ROWTYPE;
      C  TABLE_C%ROWTYPE;
    BEGIN
     
      select 
         TABLE_A.* INTO A , 
         TABLE_B.* INTO B , 
         TABLE_C.* INTO C
      from TABLE_A
      inner join TABLE_B  .... [blablabla] where [blablabla] ;
     
    END TEST;
    Je suis peut être trop optimiste, est-ce possible ?

    Pour le moment, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error(10,3): PLS-00494: contrainte non prise en charge dans plusieurs cibles de type enregistrement
    Merci à tous pour votre aide !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut Le prince charmant
    En utilisant un curseur, vous pouvez avoir le type de vos reves
    (non non, pas de jeu de mot foireux)

    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
    drop table tmp1;
    drop table tmp2;
    create table tmp1 (n1 number, pad1 varchar2(50));
    create table tmp2 (n2 number, pad2 varchar2(50));
     
    insert into tmp1 values (1,'xx');
    insert into tmp1 values (2,'xx');
    insert into tmp1 values (3,'xx');
    insert into tmp1 values (4,'xx');
     
    insert into tmp2 values (1,'xx');
    insert into tmp2 values (2,'xx');
    insert into tmp2 values (4,'xx');
    insert into tmp2 values (6,'xx');
     
    commit;
     
    create or replace procedure tmp_proc is
       cursor l_cur is select tmp1.*, tmp2.* from tmp1,tmp2 where n1=n2;
       my_var2 l_cur%rowtype;
    begin
       for my_var in l_cur loop
          dbms_output.put_line(my_var.n1||' '||my_var.n2);
          my_var2:=my_var;
       end loop;
       --Ou on utilise une variable pour stocker so on ne veut aps de la boucle for
       dbms_output.put_line(my_var2.pad2);
    end;
    /
    show errors
    exec tmp_proc;
    (Perso, je prefere large le curseur implicite par contre)

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Par contre dbms_output c'est quand même rarement utile, regarde également Fonction qui retourne un curseur si besoin

  4. #4
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Par défaut
    Bonjour,
    Merci pour vos réponses

    Par contre ce n'est pas exactement le but recherché, si j'adapte le code avec le curseur ci-dessus, j'obtiens :

    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
     
    create or replace
    procedure tmp_proc IS
       cursor l_cur IS SELECT tmp1.*, tmp2.* FROM tmp1,tmp2 WHERE n1=n2;
       my_var2 l_cur%rowtype;
     
       -- Contenu de mes tables en mémoire
       v_tmp1 tmp1%ROWTYPE;
       v_tmp2 tmp2%ROWTYPE;
    begin
       FOR my_var IN l_cur loop
          -- Table 1 
          v_tmp1.n1 := my_var.n1;
          v_tmp1.pad1 := my_var.pad1;
     
          -- Table 2 
          v_tmp2.n2 := my_var.n2;
          v_tmp2.pad2 := my_var.pad2;
       end loop;
       -- A ce moment là, mes ROWTYPE sont remplis, je peux les passer en paramètre, jouer avec ...
    end;
    Pour remplir mes 2 ROWTYPE (le but étant d'avoir une structure en mémoire) je dois mapper les champs 1 à 1, pas pratique...

    Je peux remplir les ROWTYPE 1 à un 1 mais là aussi pas pratique ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from tmp1 INTO v_tmp1  where ...
    select * from tmp2 INTO v_tmp2 where ...

    En fait je recherche la solution miracle, rapide et surtout lisible mais peut être qu'elle n'existe pas.

    En tout cas merci pour ces premiers éléments de réponse

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Est ce que ça correspond à ton besoin ?
    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
    CREATE OR REPLACE procedure tmp_proc IS
      cursor l_cur IS SELECT tmp1.*, tmp2.* FROM tmp1,tmp2 WHERE n1=n2;
      TYPE TYPE_MY_VAR2 IS TABLE OF l_cur%rowtype;
      my_var2 TYPE_MY_VAR2;
    begin
       open l_cur;
        loop fetch l_cur bulk collect into my_var2 limit 500;
          -- A ce moment là, mes ROWTYPE sont remplis, je peux les passer en paramètre, jouer avec ...
          for i in my_var2.first..my_var2.last loop
    	dbms_output.put_line (my_var2(i).pad1 || ' ' || my_var2(i).pad2);
          end loop;
        Exit When l_cur%NOTFOUND ;
       end loop;   
    end;
    /
    Regarde aussi Collections et enregistrements.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    La seule partie interessante de l'exemple qui suit, c'est que dans le select on cree des objets directement. Ce sont des objets cree en base. Et ensuite, on assigne les objets grace au fetch into qui prends plusieurs variables.
    Visiblement, avec des records PLSQL, ca ne fonctionne pas.
    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
    drop table tmp1;
    drop table tmp2;
     
    create table tmp1 (n1 number, pad1 varchar2(40));
    create table tmp2 (n2 number, pad2 varchar2(40));
     
    insert into tmp1 values (1,'x');
    insert into tmp1 values (2,'x');
    insert into tmp1 values (3,'x');
    insert into tmp1 values (4,'x');
    insert into tmp1 values (5,'x');
    insert into tmp1 values (6,'x');
     
    insert into tmp2 values (1,'y');
    insert into tmp2 values (3,'y');
    insert into tmp2 values (5,'y');
    insert into tmp2 values (7,'y');
     
    commit;
     
    create or replace type tmp_type1 as object (n1 number, pad1 varchar2(40));
    /
    create or replace type tmp_type2 as object (n2 number, pad2 varchar2(40));
    /
     
    declare
       type tmp_type1_tt is table of tmp_type1;
       type tmp_type2_tt is table of tmp_type2;
       a1 tmp_type1_tt;
       a2 tmp_type2_tt;
    begin
       select tmp_type1(tmp1.n1,tmp1.pad1),tmp_type2(tmp2.n2,tmp2.pad2) bulk collect into a1,a2 from tmp1,tmp2 where n1=n2;
       dbms_output.put_line(a1.count||' '||a2.count);
       for i in a1.first..a1.last loop
          dbms_output.put_line(a1(i).n1||': '||a1(i).pad1);
       end loop;
       dbms_output.put_line('.');
       for i in a2.first..a2.last loop
          dbms_output.put_line(a2(i).n2||': '||a2(i).pad2);
       end loop;
    end;
    Et qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    3 3
    1: x
    3: x
    5: x
    .
    1: y
    3: y
    5: y
     
    PL/SQL procedure successfully completed.

Discussions similaires

  1. Plusieurs fusions pour remplir une variable
    Par atyrdl dans le forum Débutez
    Réponses: 7
    Dernier message: 03/07/2012, 19h19
  2. Select SUM sur plusieurs variables
    Par Cannaould dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/04/2012, 13h48
  3. Select Case avec plusieurs variables
    Par sphynxounet dans le forum VB.NET
    Réponses: 10
    Dernier message: 10/08/2009, 18h16
  4. Eviter plusieurs OR dans une requete SELECT
    Par zoubidaman dans le forum Requêtes
    Réponses: 2
    Dernier message: 13/06/2004, 05h56
  5. Réponses: 5
    Dernier message: 28/04/2004, 16h06

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