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 :

[PL/SQL] Utilisation table PL/SQL dans clause IN


Sujet :

PL/SQL Oracle

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut [PL/SQL] Utilisation table PL/SQL dans clause IN
    bonjour,
    j'aimerais savoir si il est possible et si oui quelle est la syntaxe pour utiliser une table PL/SQL dans la clause IN d'un Select...

    merci d'avance,

    PS le tableau PL sera chargé à partir d'un curseur...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je n'ai pas de solution mais dans le même genre j'aimerais savoir s'il est possible de faire un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ... where id in (c)
    où c est un curseur, je pense que ca ressemble fortement au probleme de Yorglaa.

    J'ai des fonctions stockées qui me renvoient un ref cursor et au lieu de faire une table temporaire dans laquelle je mets tous les identifiants fetchés à partir du curseur, est-il possible d'utiliser directement le contenu du curseur dans une requête ?


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Et bien, c'est chaud...

    tout ce que je peux faire est de créer une fonction PIPELINED

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TYPE table_char IS TABLE OF VARCHAR2(100) ;
    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 function test_refcursor (cur_lig in SYS_REFCURSOR)
       return table_char PIPELINED
     IS
      t table_char ;
      v varchar2(100) ;
     Begin
      Loop
        Fetch cur_lig into v ;
        Exit When cur_lig%NOTFOUND ;
          -- Retour des valeurs --
          PIPE ROW( v ) ;
      End loop ;
      Return ;
      End ;
    que j'appelle de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select * from messages
    where code in ( select * from table(test_refcursor(CURSOR(Select code from messages))) )
    Bien sûr cela ne répond pas complètement à la question mais peut représenter une base de recherche...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Super merci...

    je vais essayer ça ...
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  5. #5
    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
    et pourquoi pas simplement l'utilisation d'une boucle avec FORALL : http://download-west.oracle.com/docs/cd/A87860_01/doc/appdev.817/a77069/05_ora.htm#36174

    Au niveau perf ce sera exactement pareil

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    J'imagine que le but est d'alimenter une clause IN() avec n'importe quel curseur passé en argument.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  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
    Et bien, tu peux alimenter une table avec n'importe quel curseur et utiliser un FORALL et une égalité en lieu et place du IN

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Et bien c'est ce que fait la fonction pipelined.

    Il faudrait essayer de lui transmettre directement un pointeur de type REFCURSOR (au lieu du select)
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  9. #9
    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
    Ha bon... le pipeline me semble bigrement compliqué par rapport au FORALL c'est pour ça... je pense à la TMA

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    euhhh désolé pour la question basique... mais vous pourriez juste me rappeler la syntaxe du FORALL ?
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    c'est expliqué dans l'article : Guide PL/SQL....
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  12. #12
    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
    j'ai donné le lien juste au dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
       TYPE NumList IS VARRAY(20) OF NUMBER;
       depts NumList := NumList(10, 30, 70, ...);  -- department numbers
    BEGIN
       ...
       FOR i IN depts.FIRST..depts.LAST LOOP
          ...
          UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);
       END LOOP;
    END;
    Devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE
       TYPE NumList IS VARRAY(20) OF NUMBER;
       depts NumList := NumList(10, 30, 70, ...);  -- department numbers
    BEGIN
      FORALL i IN depts.FIRST..depts.LAST
       UPDATE emp SET sal = sal * 1.10 WHERE deptno = depts(i);
    END;
    A lire aussi : http://download-west.oracle.com/docs/cd/A87860_01/doc/appdev.817/a77069/04_colls.htm#23723

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    oups, pardon à vous deux

    je vais aller piocher dans le guide de Sheik et dans les liens à orafrance...

    désolé encore j'ai réagi trop vite... je je voulais froisser personne !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  14. #14
    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
    Pas de probléme

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

Discussions similaires

  1. [SQL] #1109 - Table inconnue 'ville_latlong' dans where clause
    Par ffoxenn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/01/2008, 18h06
  2. [SQL] Utiliser un autre champ dans une table si le champ par défaut est vide
    Par Mawashigeri dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/01/2008, 14h31
  3. [SQL] Problème de requête sql utilisant LIKE
    Par yakup.67 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 14h31
  4. [SQL] Utilisation des opérateurs SQL plutôt que PHP
    Par php_newbie dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/05/2006, 12h38
  5. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 18h08

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