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 :

Procédure stockée pour décrire schéma relationnel


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut Procédure stockée pour décrire schéma relationnel
    Bonjour

    je débute en PL/SQl et je galère

    je souhaite décrire différents schémas relationnels (nom tables et contraintes) à partir d'une base Oracle 7.3.4 (oui très vieux, je suis en stage) et enregistrer toutes ces informations dans un fichiers excel ou csv
    je souhaite donc passer en paramètre, le nom de la base à décrire

    J'ai donc commencé par écrire les 4 requêtes ci-dessous qui me permettront de récupérer les informations que je souhaite
    -- liste des tables de la base que j'utiliserai dans un curseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER like ‘nomDeMaBase’;
    -- Description de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DESCRIBE ‘nomDeMaBase';
    -- Description des contraintes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION, R_CONSTRAINT_NAME
    FROM ALL_CONSTRAINTS
    WHERE OWNER like ‘nomDeMaBase’ AND TABLE_NAME like ‘nomDeMaTable’;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CONSTRAINT_NAME, COLUMN_NAME, POSITION
    FROM ALL_CONS_COLUMNS
    WHERE OWNER like ‘nomDeMaBase’ AND TABLE_NAME like ‘nomDeMaTable’;
    ;
    Ensuite, j'ai écrit une première procédure stockée qui me retourne la liste des tables de la base passée en paramètre et elle fonctionne
    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
    CREATE OR REPLACE PROCEDURE descriptionBase(nom varchar2)
    IS
    	c_nom_table varchar2(25);	
    	CURSOR c_base IS SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER=nom;
    BEGIN
    	OPEN c_base;
    	LOOP
    	FETCH c_base INTO c_nom_table;
    	EXIT WHEN c_dms%NOTFOUND;
    	DBMS_OUTPUT.PUT_LINE (c_nom_table);
            -- SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE OWNER=nom AND TABLE_NAME=c_nom_table;
    	END LOOP; 
    	CLOSE c_dms;
    END;
    /
    Mais à partir de là je bloque sur
    1. comment écrire dans un fichier txt (ou excel) : j'ai lu sur la commande UTL_FILE mais je n'ai pas les droits suffisants pour créer un répertoire
    2. utiliser mon curseur pour lancer les 3 autres requêtes : lorsque j'ajoute un select (ligne commentée dans la procédure ci-dessus) j'ai une erreur de compilation

    d'avance merci pour votre aide (et votre indulgence, je part vraiment de 0 en PL/SQL)

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 963
    Par défaut
    Bonsoir,

    Le code SQL ou Pl va s’exécuter sur le serveur.
    Il est tout à fait logique et sain que tout utilisateur n'ai pas le droit d’écrire sur le serveur lui même.

    Tout dépend de l'architecture voulue :
    1- Mutualisation des fichiers exportés
    2- Export à la demande, client par client

    1- Mutualisation des fichiers exportés
    Votre démarche était la bonne :
    * créer un dossier https://docs.oracle.com/cd/B19306_01...ments_5007.htm
    * donner les droits aux utilisateurs qui auront le droit de faire les exports
    * partager ce dossier

    2- Export à la demande, client par client
    Il faut inverser la vision : on se connecte à oracle depuis un client, charge à lui à "traiter" le resultat.
    Par exemple : depuis XL voir :
    https://docs.oracle.com/cd/B28359%5F...g.htm#i1017396

  3. #3
    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
    Tu peux très bien utiliser ton logiciel (sqlplus, sqldevelopper) qui te sert à exécuter ta procédure et de récupérer ce que te sort ton dbms_output, si tu ne peux pas créer un fichier avec utl_file

    Pour ta seconde question :

    1/ déjà préfère l'utilisation de FOR LOOP au OPEN FETCH (plus simple, fermeture automatique du curseur par Oracle).. j'espère que ça existe en 7 .. parce que moi 7 j'ai jamais connu
    2/ Tout SELECT en PLSQL doit avoir un INTO, donc il faut que tu passes par un second curseur (tu vois l'utilité de la simplification du FOR LOOP, tu peux de plus mettre ta requête dans le for loop)
    Attention, peut être que ce sont des façons que ne gère pas une base 7..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE
      CURSOR c_base IS SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER=nom;  -- Je le laisse pour que tu vois les 2 façons
    BEGIN
    	FOR rt IN c_base
    	LOOP
    		DBMS_OUTPUT.PUT_LINE ('Nom table:'|| rt.table_name);
           		FOR rc IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE OWNER=nom AND TABLE_NAME=rt.table_name)
    		LOOP
    			DBMS_OUTPUT.PUT_LINE('Constraint '|| rc.constraint_name);
    		END LOOP;
    	END LOOP; 
    END;

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    "une base Oracle 7.3.4 (oui très vieux, je suis en stage)" : c'est pas très vieux, c'est antédiluvien

    Et pour quelle raison ils utilisent une base Oracle 7?

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut
    Bonjour,

    merci pour vos messages
    en fait il s'agit d'une ancienne solution remplacée par une solution commerciale il y a quelques années mais l'intégrateur de cette nouvelle solution a refusé (je n'ai pas les détails) de récupérer les données
    donc certains utilisateurs ont besoin de recourir à l'ancienne solution pour consulter des données d'historique

  6. #6
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut Describe
    Bonjour,

    Au lieu d'utiliser DESCRIBE, utile via SQLDeveloper, moins en PL/SQL, il est possible d'interroger le dictionnaire de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select UTC.TABLE_NAME, UTC.COLUMN_NAME, UTC.DATA_TYPE, UTC.DATA_LENGTH, UTC.DATA_PRECISION 
    from USER_TAB_COLS UTC 
      INNER JOIN USER_OBJECTS UO ON (UTC.TABLE_NAME = UO.OBJECT_NAME AND UO.OBJECT_TYPE='TABLE')
    ORDER BY UTC.TABLE_NAME, UTC.COLUMN_NAME;
    Et on peut filtrer pour ne sortir que les tables ou décrire aussi les vues.

Discussions similaires

  1. Procédure Stockée pour créer des TABLE dynamiquement
    Par GuyverZ dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/05/2009, 22h29
  2. [PEAR][DB] Appel de procédure stockée dans différents schémas sous postgresql
    Par rebolon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 22/09/2006, 16h49
  3. Réponses: 2
    Dernier message: 28/05/2006, 23h31
  4. procédure stockée pour renvoyer un état dans une application
    Par erickoffi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/10/2005, 19h05
  5. Réponses: 5
    Dernier message: 04/10/2004, 18h20

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