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 :

Accès à une même table sur plusieurs schémas


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant communication & réseaux
    Inscrit en
    Novembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant communication & réseaux

    Informations forums :
    Inscription : Novembre 2014
    Messages : 57
    Points : 50
    Points
    50
    Par défaut Accès à une même table sur plusieurs schémas
    Salut,

    Je suis débutant pl/sql et j'ai un probleme à résoudre: Sur une instance j'ai n schémas comportants les memes tables ayant toutes la meme structure.
    Le but de ma procédure est de récupérer la valeur d'un champs donné sur l'ensemble de ces schémas.

    j'ai commencé à ecrire la procédure suivante qui prend en paramètre le nom de la table et un champs:

    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
    create or replace PROCEDURE GET_FIELD_VALUE( TAB_NAME IN VARCHAR2, TAB_FIELD IN VARCHAR2) IS
     
    username dba_users.username%TYPE;
    table_name VARCHAR2(50):='MA_TABLE';
    field_value VARCHAR(50):='MON_CHAMPS';
    sSqlStmt VARCHAR2(500):='';
     
      /*recupere les bases courantes à partir de dba_users*/
      CURSOR C1 IS
      SELECT DISTINCT(USERNAME)
      FROM dba_users
      ORDER BY USERNAME;
     
    BEGIN
      OPEN C1;
      LOOP
        FETCH C1 INTO username;
        EXIT WHEN C1%NOTFOUND;
        sSqlStmt:= 'SELECT'||' '|| field_value||' '|| 'FROM'||' '|| username||'.'||table_name||';'; 
        DBMS_OUTPUT.PUT_LINE (sSqlStmt);
        --DBMS_OUTPUT.PUT_LINE (username);
      END LOOP;
        CLOSE C1;
    END;
    je bloque en faite pour faire executer la requete construite dynamiquement et obtenir le résultat à partir du nom du schéma, de la table et du champs de cette table. Dois ouvrir un second curseur auquel je passe le résultat du premier?

    merci pour vos conseils,

  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
    Oui, 1 curseur pour lire les différents user ayant cette table (et pas tous les utilisateurs de la base comme tu l'as fait)
    Ensuite pour chaque utilisateur, lire les données.

    Petit conseil, évite les OPEN FETCH quand tu le peux. Préfère le FOR LOOP qui ferme automatiquement le curseur, pas de test d'existence, etc..
    Evite aussi les variables avec des noms qui peuvent être des nom de colonne (exemple table_name)

    Enfin il faut gérer les différents types de colonnes (VARCHAR, NUMBER, DATE).. et voir comment récupérer les données.

    Dans l'exemple ci dessous, je passe par un cursor, mais on pourrait faire un EXECUTE IMMEDIATE BULK COLLECT INTO pour renseigner directement un tableau de valeur.

    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
    CREATE OR REPLACE PROCEDURE GET_FIELD_VALUE( TAB_NAME IN VARCHAR2, TAB_FIELD IN VARCHAR2) IS
    	TYPE Tcur IS REF CURSOR;
    	cur Tcur;
    	sSqlStmt VARCHAR2(500):='';
     v_donnee VARCHAR2(20);
    BEGIN	
    --	FOR r1 IN (SELECT owner FROM ALL_TABLES WHERE table_name = TAB_NAME ORDER BY OWNER)
    -- Mieux pour être sur que la colonne existe dans cette table pour cet utilisateur
    	FOR r1 IN (SELECT owner FROM ALL_TAB_COLUMNS WHERE table_name = TAB_NAME AND column_name = TAB_FIELD ORDER BY owner)
      LOOP
        sSqlStmt:= 'SELECT '|| field_value ||' FROM '|| r1.owner ||'.'|| TAB_NAME; 
        DBMS_OUTPUT.PUT_LINE (sSqlStmt);
    		-- On lit les données
        OPEN cur FOR sSqlStmt;
        LOOP
          FETCH cur INTO v_donnee;
          EXIT WHEN cur%NOTFOUND OR cur%NOTFOUND IS NULL;
        	DBMS_OUTPUT.PUT_LINE(v_donnee);
        END LOOP;
        CLOSE cur;
      END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/06/2012, 12h31
  2. Exécuter une même requête sur plusieurs bases
    Par TristanL dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/06/2011, 09h49
  3. verification d'une même erreur sur plusieurs tables
    Par sousleau12 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/02/2009, 13h23
  4. Une même applet sur plusieurs pages
    Par suckthewindow dans le forum Applets
    Réponses: 6
    Dernier message: 20/08/2008, 16h36
  5. Plusieurs Champs d'une même table dans plusieurs textebox
    Par cyberbiker dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 13/09/2006, 11h32

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