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 :

Faire un select from d'une variable "is table of"


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut Faire un select from d'une variable "is table of"
    Bonjour,


    Dans ma procédure SQL j'ai déclaré un type table à partir d'un record:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     type type_t_cmde_at IS RECORD(
        num_cmde xxx.num_cmde%type,
        date_cmde xxx.date_cmde%type
       );
     
      type tab_t_cmde_at is table of type_t_cmde_at;
      T_CMDE_AT tab_t_cmde_at;
    Ensuite dans mon begin j'ai rempli cette table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
        C.NUM_CMDE,
        C.DATE_CMDE  bulk collect INTO T_CMDE_AT
      FROM  ......;
    J'arrive a boucler dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for elem in 1 .. T_CMDE_AT.count 
        loop
    ...
    end loop;
    Sauf que je souhaiterai utiliser ma table comme une table normale, car, pour ce que je souhaite en faire, un for...in.. me semble pas la meilleure méthode..
    je voudrais faire un " SELECT * FROM T_CMDE_AT ..." sauf que ça ne marche pas.

    Es-ce que c'est possible? si oui est-ce que quelqu'un peut me dire comment s'il vous plaît?
    Et si non, comment je peux remplacer cette table? sachant que je ne veux pas (si possible) créer une vraie table pour ça...

    Merci beaucoup!!!

    Léa.

  2. #2
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Pourquoi tu ne te sources pas directement sur ta requete ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select .... from (
    SELECT 
        C.NUM_CMDE,
        C.DATE_CMDE  bulk collect 
      FROM  ......
    );
    T'es peut etre pas obligée de la stocker, non ?

    Ou alors, deux autres possibilités : la vue ou la table temporaire.

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par bstevy Voir le message
    Pourquoi tu ne te sources pas directement sur ta requete ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select .... from (
    SELECT 
        C.NUM_CMDE,
        C.DATE_CMDE  bulk collect 
      FROM  ......
    );
    T'es peut etre pas obligée de la stocker, non ?

    Ou alors, deux autres possibilités : la vue ou la table temporaire.

    Bonjour,

    Je voulais la stocker parce que la requête en elle même est par forcement simple (sans etre une requete super longue et complexe, elle possède des jointures et des group by..) et comme je boucle dessus par la suite c'est pour ne pas avoir à exécuter la requête 50 000 fois...
    Me suis dis : exécution de la requete 1 fois =>récupération d'une table simple à réutiliser dans mes boucles ensuites.

    Pour l'instant je suis effectivement partie sur une vue car la table temporaire (mon idée de départ.. j'ai pas vraiment compris comment ça marchait ni comment la créée.. echec sur echec ... ).
    Maintenant c'est surtout si quelqu'un a une solution pour ce problème la. Mais sur un autre post j'ai cru voir que ça n'était pas possible..

    Merci pour ta réponse ^^

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu ne peux pas, à moins de mettre ton type record en base, et ensuite de créer des fonction pipelined.. bref, le mieux est de créer une table (temporaire si elle ne sert que pour un traitement et n'est pas destinée à garder les données).
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par McM Voir le message
    Tu ne peux pas, à moins de mettre ton type record en base, et ensuite de créer des fonction pipelined.. bref, le mieux est de créer une table (temporaire si elle ne sert que pour un traitement et n'est pas destinée à garder les données).
    Ok merci!

    Par contre les tables temporaires (ce que je voulais utiliser à la base) c'est par exemple :
    execute immediate 'create global temporary table my_temp_table(id number)
    on commit preserve rows';
    Quand j'essaie, ça me fait une erreur : ORA-01031: privilèges insuffisants.. je ne sais pas pourquoi..
    Que signifie le "on commit preserve rows" ? aurais-tu un lien qui pourrait m'aider car ce sont des choses que je ne connais pas pour le moment et mes recherches ne m'ont pas vraiment aidées?
    Merci!!

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    voici le lien :
    http://docs.oracle.com/cd/B28359_01/...htm#ADMIN11633

    Si tu veux t'en servir dans une procédure, il faut la créer en base (et pas la créer dans la procédure, sinon tu es obligé de tout passer en dynamique ce qui n'est pas performant).
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Ok merci vais regarder ça je ferai mon choix de méthode en fonction

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/01/2008, 09h54
  2. Select box sur une variable
    Par elfenlieder dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 13/11/2007, 11h26
  3. un SELECT borné par une variable JS
    Par rragnarok dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 04/09/2007, 05h15
  4. Réponses: 7
    Dernier message: 12/07/2006, 10h03
  5. Select en utilisant une variable
    Par georgeabitbol dans le forum Oracle
    Réponses: 3
    Dernier message: 23/03/2006, 11h11

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