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 :

PLSQL qui retourne un select


Sujet :

PL/SQL Oracle

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut PLSQL qui retourne un select
    Bonjour,

    Je n'arrive pas à faire une procédure/fonction simple qui me retourne un select.


    En fait dans ma db je dispose d'une table recensent l'ensemble des tables de ma db, et j'obtiens le nom avec la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T_TABLE_ORIGINE
     FROM TABLE_ORIGINE
    WHERE ID_TABLE_ORIGINE = 3
    Une fois obtenu le résultat, je vaux effectuer un select sur la table retourner par la requêtes précédente....je n'arrive pas à comprendre comment obtenir cela en store pro....

    Je tente des choses de ce type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE FUNCTION "SCOTT"."TEST"
    (x IN INT)
     
    DECLARE
    nom_table := SELECT T_TABLE_ORIGINE
     FROM TABLE_ORIGINE
    WHERE ID_TABLE_ORIGINE = x
     
    IS
    BEGIN
      return SELECT * FROM nom_table
    END;
    Je sais que je suis loin du compte, mais si vous pouviez m'orienter.

    Merci.

  2. #2
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE FUNCTION "SCOTT"."TEST" (x IN INT) RETURN VARCHAR2
    IS
       nom_table TABLE_ORIGINE.T_TABLE_ORIGINE%TYPE;
    BEGIN
       SELECT T_TABLE_ORIGINE
       INTO nom_table
       FROM TABLE_ORIGINE
       WHERE ID_TABLE_ORIGINE = x;
       RETURN nom_table;
    END;

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Merci de la rapidité

    Mais cela ne réponds qu'a la moitié de ma question, si je suis le raisonnement, je devrais compléter par quelque chose comme 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
    16
    17
    18
    19
    20
    21
     
    CREATE OR REPLACE FUNCTION "SCOTT"."TEST" (x IN INT) RETURN VARCHAR2
    IS
       nom_table TABLE_ORIGINE.T_TABLE_ORIGINE%TYPE;
     
    BEGIN
       SELECT T_TABLE_ORIGINE
       INTO nom_table
       FROM TABLE_ORIGINE
       WHERE ID_TABLE_ORIGINE = x;
     
     t_name_one nom_table.T_NAME1%TYPE;
     t_name_two nom_table.T_NAME2%TYPE;
     
       SELECT T_NAME1,T_NAME2
       INTO t_name_one,t_name_two
       FROM nom_table; 
     
       RETURN t_name_one,t_name_two;
    END
    ;
    Mais la déclaration de mes nouvelles variables sont incorrectes !

    Merci de votre aide.

  4. #4
    Membre éclairé Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Par défaut
    Attention : tes déclarations de type doivent être dans un bloc DECLARE, soit un nouveau soit après le IS avec l'autre déclaration.

    Et une fonction ne peut retourner qu'une et une seule valeur.

    Donc soit tu fais une fonction générique qui pour un id renvoi un nom et tu appelles 3 fois ta fonction dans ton code, soit tu fais une procédure qui peut retourner plusieurs valeurs.

  5. #5
    Expert confirmé 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
    Par défaut
    Probablement vous cherchez quelque chose comme ça:
    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
     
    Create Or Replace Function ref_crs (
      p_id In table_origine.id_table_origine%Type
    ) Return sys_refcursor Is
      l_t_table_origine        table_origine.t_table_origine%Type;
      l_rc                     sysrefcursor;
    Begin
      Select t_table_origine
        Into l_t_table_origine
        From table_origine
       Where id_table_origine = p_id;
      -- 
      Open rc for 'Select * from '||l_t_table_origine;
      Return rc;
      --
    End;
    /
    Lisez aussi le tutoriel du PL/SQL si vous voulez écrire du code en PL/SQL.

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    SUPER

    J'ai rectifié une erreur ou deux dû à la nomenclature mais c'est exactement ça.

    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
     
    CREATE OR REPLACE FUNCTION "SCOTT"."REF_CRS" (
      p_id IN table_origine.id_table_origine%Type
    ) RETURN sys_refcursor 
    IS
      l_t_table_origine table_origine.t_table_origine%Type;
      l_rc  SYS_REFCURSOR;
    Begin
      SELECT t_table_origine
        INTO l_t_table_origine
        FROM table_origine
       WHERE id_table_origine = p_id;
      --
      Open l_rc FOR 'Select * from '||l_t_table_origine;
      RETURN l_rc;
      --
    End;
    Merci

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    En fait, je me suis emballé, c'est un curseur et donc je ne peux le manipuler comme je veux.

    En Googelant je suis tomber sur une solution avec type_objet et type_table, cela correspond presque, je n'arrive pas à faire passer un nom de table par une variable dans mon select

    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 "SCOTT"."ALL_EMPS" return emp_tab 
       is 
          l_emp_tab emp_tab := emp_tab(); 
          n integer := 0;
          nom_table varchar2(50) := 'USER_FAMHP';
       begin 
          for r in (select t_name_1, t_name_2 from nom_table)
          loop 
             l_emp_tab.extend; 
             n := n + 1; 
            l_emp_tab(n) := emp_obj(r.t_name_1, r.t_name_2); 
          end loop; 
          return l_emp_tab; 
       end;

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPEN r FOR 'select ...'|| nom_table ..

  9. #9
    Expert confirmé 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
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    En fait, je me suis emballé, c'est un curseur et donc je ne peux le manipuler comme je veux.
    ...
    Comme je veux ou comme je sais ? Qu’est-ce que vous voulez faire et que vous ne pouvez pas ?

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    @McM : pas mieux

    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 "INDICATEUR_TEST"."ALL_EMPS" return emp_tab 
       is 
          l_emp_tab emp_tab := emp_tab(); 
          n integer := 0;
          nom_table varchar2(255) := 'USER_FAMHP';
       begin 
          OPEN r FOR 'select t_name_1, t_name_2 from '||nom_table
          loop 
             l_emp_tab.extend; 
             n := n + 1; 
            l_emp_tab(n) := emp_obj(r.t_name_1, r.t_name_2); 
          end loop; 
          return l_emp_tab; 
       end;
    @mnitu : je voudrais simplement récupérer un résultat classique de requête SQL.

    En fait imaginer la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t_name_1, t_name_2 
    FROM (SELECT T_TABLE_ORIGINE
            FROM TABLE_ORIGINE
          WHERE ID_TABLE_ORIGINE =3
    )
    Où la sous requête du from donnerais le nom d'une table

  11. #11
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    La structure du OPEN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    OPEN v_cur FOR 'SELECT * FROM '|| v_table;
     LOOP
    	FETCH v_cur INTO v_record
    	EXIT WHEN v_cur%NOTFOUND OR v_cur%NOTFOUND IS NULL;
       ...
    END LOOP;
    CLOSE v_cur;

  12. #12
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Il me dit que v_cur doit-être déclaré....oui mais en tant que quel type

  13. #13
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Là, je vais te renvoyer sur les tutos
    http://sheikyerbouti.developpez.com/...e=Chap1#L1.2.3

    De plus, voici la déclaration sur une des procédures de mon exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     TYPE cur_typ    IS REF CURSOR;
    	v_cur		    cur_typ;

  14. #14
    Expert confirmé 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
    Par défaut
    Citation Envoyé par MaitrePylos;5250729...
    @mnitu : je voudrais simplement récupérer un résultat classique de requête SQL.

    En fait imaginer la requête suivante
    ...
    Où la sous requête du from donnerais le nom d'une table
    C'est exactement ça que la fonction que j’ai proposée, fait. Le résultat d'un Select c'est un curseur (implicite parfois). Qu’est-ce que ça vous pose comme souci pour l’utiliser et avec quel langage ?

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est exactement ça que la fonction que j’ai proposée, fait. Le résultat d'un Select c'est un curseur (implicite parfois). Qu’est-ce que ça vous pose comme souci pour l’utiliser et avec quel langage ?
    Je travaille avec PHP, mais je dois avouer que je n'ai pas encore tester avec ce langage.

    Néanmoins mes IDE SQL (AquaData Studio et Navicat), ne retourne absolument rien.

    Le seul résultat visible obtenu avec votre proposition ce fait dans SQL*Plus.

  16. #16
    Expert confirmé 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
    Par défaut
    Toute langage qui accède à la base et qui est capable de traiter le résultat d’un select via des « concepts » telle que Recordset, Dataset, etc. est capable de traiter également un ref cursor. PHP et ref cursor ne doit pas poser des problèmes. Même remarque pour vos IDE SQL.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/03/2009, 11h20
  2. select qui retourne que le premier element
    Par sallemel dans le forum Hibernate
    Réponses: 6
    Dernier message: 12/12/2008, 17h40
  3. un SELECT qui retourne plus de ligne que la table
    Par gomodo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/10/2007, 14h17
  4. Faire un Select qui retourne dans un certain ordre
    Par Rodie dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/01/2007, 22h29
  5. procedure stoquee qui retourne un "select"
    Par zerovolt dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/03/2005, 17h02

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