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 :

Nom de table en paramètre d'une boucle [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Points : 53
    Points
    53
    Par défaut Nom de table en paramètre d'une boucle
    Bonjour à tous,

    Je cherche à écrire une procédure qui passerait en paramètre le nom de la table à traiter.

    Je n'arrive qu'à des échecs pour l'instant, car je vois des choses en sql dynamiques, des curseurs explicites ou même implicites, mais rien qui à priori me permettrait d'utiliser le paramètre en question


    - J'ai voulu m'inspirer de la discussion suivante, mais dans mon cas je ne vois pas comment faire, car il faudrait déclarer une variable qui précise le nom de la table (du type v_variable nomtable%rowtype) :
    https://www.developpez.net/forums/d4...able-argument/

    Impossible de passer un paramètre dans un bloc déclaratif

    - A priori impossible non plus de faire une boucle for rec in (nomrequete) loop, où nomrequete serait une variable varchar2

    Je ne suis pas sure qu'il existe une solution à mon problème, mais dans le doute, voici ma procédure en l'état actuel, et donc qui 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
    CREATE OR REPLACE procedure SOCIAL.test
    ( table_name in varchar2) 
    is
     
    sqlcur varchar2(255);
    TYPE mon_curseur_type is ref cursor;
    mon_curseur  mon_curseur_type;
    mon_buffer varchar2(4000);
     
    BEGIN
    sqlcur := 'select * from SOCIAL.' || table_name ;
    dbms_output.put_line (sqlcur);
     
    open mon_curseur for sqlcur;
     
    loop
    fetch mon_curseur into mon_buffer;
    exit when mon_curseur%NOTFOUND;
    dbms_output.put_line (mon_buffer);
    end loop;
     
    END;
    /
    A l'exécution de la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute social.test ('CCAS');
    je comprends bien que la variable mon_buffer devrait être du type nomtable%rowtype, et non varchar2


    En espérant que ma demande soit claire, pourriez-vous me dire si je peux contourner les embûches et trouver une solution?

    Merci par avance pour l'aide que vous pourriez m'apporter

    Cécile

  2. #2
    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
    Le problème vient du "SELECT *" car l'affectation INTO nécessite de connaitre le nombre de colonnes (ainsi que le type)
    Le moyen de contournement est de regrouper toutes les colonnes de la table en faisant du to_char et de la concaténation (donc une première boucle sur all_tab_columns pour générer une variable Vch2 qui contiendra par exemple "col1 ||';'|| col2 || TO_CHAR(col3, 'DD/MM/YYYY')....") puis mettre le résultat à la place du *

    Bref, faire du PLSQL pour faire du dbms_output d'un select *, ce n'est pas vraiment le but du PLSQL
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Points : 53
    Points
    53
    Par défaut
    Merci pour votre réponse


    Pour l'exemple, j'avais simplifié le corps de la boucle en n'y mettant qu'un dbms_output, mais en réalité je doit traiter un champ en particulier dans cette boucle.
    Ce champ est tjrs le même quelque soit la table passée en paramètre

    Donc en fait je pourrais faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlcur := 'select GID from SOCIAL.' || table_name ;
    Auquel cas je passe ma variable buffer en type integer puisque mon champ GID est un entier. Pas besoin d'un %rowtype!

    Vous venez de m'ouvrir les yeux sur le problème.

    Un grand merci!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/06/2015, 18h59
  2. [MySQL-5.1] Passer le nom d'une table en paramètre d'une procédure
    Par boubanet dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 08/06/2014, 18h06
  3. Passage d un nom de table en paramètre d'une procédure stockée
    Par Cedric33 dans le forum Développement
    Réponses: 22
    Dernier message: 10/02/2009, 16h12
  4. Réponses: 6
    Dernier message: 12/01/2009, 15h57
  5. Faire du nom de la table un paramètre dans une requête
    Par sofiane1111 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/09/2007, 14h27

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