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 :

Passer un tableau en paramètre d'un IN


Sujet :

PL/SQL Oracle

  1. #1
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut Passer un tableau en paramètre d'un IN
    Bonjour,

    est-il possible de passer en paramètre d'un IN une variable de type TABLE OF ?

    en gros faire truc comme ce-ci mais différement car le code 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
    DECLARE
        
        TYPE myTableType IS TABLE OF NUMBER INDEX BY LONG;
        myTable myTableType;
        
        begin
        
        myTable (1) := 45;
        myTable (2) :=  60;
        
        FOR C1 IN (select *
        from MATABLE
        where TABLE_ID IN myTable ) LOOP
        
        dbms_output.put_line('Valeur trouvée :' || C1.TABLE_ID);
        
        END LOOP;
    
        end;
    Merci d'avance
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Un des moyens est d'utiliser une table temporaire

  3. #3
    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 si l'exemple posté ici réponde à ta question.

  4. #4
    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
    Déjà si tu veux manipuler ton type avec du sql, il faut le créer en type stocké.

    Le IN ne fonctionnera pas directement sur ta variable, il faudra utiliser une syntaxe sql: select * from table(myTable)

    Attention à la scalabilité de ton code en utilisant ce genre de syntaxe, il est parfois meilleur d'utiliser une solution à base de table temporaire comme le propose orafrance si les volumes à traiter deviennent importants.

    (par ailleurs, j'ai pas bien compris l'intérêt d'un long pour indexer ton tableau )

  5. #5
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Merci à tous, le problème est résolu en passant par une table temporaire
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  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
    Dommage, c'est plutôt une mauvaise solution.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pourquoi ?

  8. #8
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Dommage, c'est plutôt une mauvaise solution.
    Oui pourquoi ?
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  9. #9
    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
    Parce que si au départ le choix d'un tableau associatif n'est pas totalement erroné alors il n'y a pas besoin de passer par une table temporaire.
    La solution avec la table temporaire signifie déjà la création (et maintenance) d'un nouveau objet dans la base. En plus, des temps de réponse plus longs due aux opérations de copie des donnés se trouvant déjà dans la mémoire dans le tableau en question vers la table temporaire, plus la suppression des données de ce table, etc. doivent être observés.

    Je pense que la solution suivante devrait faire l'affaire
    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
    50
    51
    52
     
    CREATE OR REPLACE type tab_nr AS TABLE of number
    /
    CREATE OR REPLACE PACKAGE cols_pkg AS
      Type gt_number Is Table of Number Index By Binary_Integer;  
     
      procedure init;
      function f_pipe return tab_nr Pipelined;   
      END cols_pkg;
    /
     
    CREATE OR REPLACE PACKAGE BODY cols_pkg AS
      g_eno gt_number;
      --
      Procedure Init Is
      Begin
        g_eno(1) := 7369;
        g_eno(2) := 7499;      
        g_eno(3) := 7521;
      End;
      --
      Function f_pipe return tab_nr Pipelined Is
        i number;
      Begin
         i := g_eno.first;
         While i Is Not Null Loop
           pipe row(g_eno(i));
           i := g_eno.next(i);
         End Loop;
     
      End; 
      --
    Begin
      Init;    
    END cols_pkg;
    /
     
    mni@DIANA> begin
      2    --
      3    FOR crs IN (SELECT ename
      4                  FROM emp e
      5                 WHERE e.empno in (Select t.column_value
      6                                     from table(cols_pkg.f_pipe) t))
      7    Loop
      8      --
      9      dbms_output.put_line(crs.ename);
     10    End Loop;
     11  end;
     12  /
    SMITH
    ALLEN
    WARD

  10. #10
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Je pensais pas qu'on pouvait faire des choses comme ça . J'essaierai pour voir les performances de la première méthode et de la tienne.

    Merci encore
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Attention tout de même pour les gros tables, une temporary table peut être bien plus intéressante quand même... faut tester quoi

  12. #12
    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
    Citation Envoyé par orafrance Voir le message
    Attention tout de même pour les gros tables, une temporary table peut être bien plus intéressante quand même... faut tester quoi
    Si c'était de gros tables le choix d'un tableau associatif n'est peut être pas la bonne.
    D'une manière générale essayez de ne pas utiliser les tables temporaires. Dans 99% des cas c'est un signe d'une incompréhension du traitement relationnel surtout pour Oracle. Il semblerait que ce n'est pas le cas avec Sql Server.

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    C'est pas toujours évident d'ajouter une table au MPD notamment quand ce sont des metadata. Ceci étant, tu as raison, j'en ai pas vu souvent et je m'en suis très rarement servi

  14. #14
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Merci pour ces compléments d'informations.
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

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

Discussions similaires

  1. passer un tableau en paramètre du JSP à JS
    Par JauB dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/03/2008, 18h53
  2. Réponses: 2
    Dernier message: 10/03/2008, 18h28
  3. Passer un tableau en paramètre à une JSP?
    Par magicwill dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/07/2007, 10h22
  4. Réponses: 2
    Dernier message: 03/12/2006, 12h37
  5. Réponses: 1
    Dernier message: 23/05/2006, 14h36

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