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 :

Curseur avec requête en variable et nombre de champs inconnu


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut Curseur avec requête en variable et nombre de champs inconnu
    Bonjour,

    Mon travaille consiste à parcourir une liste de noms de tables (noms contenu dans le champs du autre table) et pour chacune récupérer sa clé primaire et ensuite parcourir le contenu de la table en sélectionnant que les champs de la clé primaire.
    Pour le moment, j'arrive seulement à :
    • parcourir ma liste de noms de table.

    • obtenir le détails de la clé primaire.


    Voici mon programme en simplifié et avec le strict nécessaire pour comprendre mon soucis:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    -- Positionnement des paramètres
    SET NEWPAGE 0
    SET SPACE 0
    SET ECHO OFF
    SET TERM ON
    SET FEEDBACK ON
    SET HEADING OFF
    SET TAB OFF
    SET LINESIZE  200
    SET TRIMSPOOL ON
    SET PAGESIZE 0
    SET VERIFY OFF
    SET SERVEROUTPUT ON SIZE 1000000
     
    DECLARE
    	TYPE type_tab IS varray (200) OF VARCHAR2(500);
    	iter					NUMBER(4, 0) := 1;
    	colonne					VARCHAR2(50) := '';
    	colonnes_cle			VARCHAR2(5000) := '';
    	requeteAnalyse			VARCHAR2(2000) := '';
    	requeteColonnes			VARCHAR2(255) := '';
    	requeteColonnesCle		VARCHAR2(255) := '';
    	curseurColonnesCle		sys_refcursor;
    	tab_colonnes_cle		type_tab;
     
     
    	CURSOR Cur1 IS
    		SELECT m.* FROM liste_noms_table m
    		ORDER BY m.nom_table;
    	V1 Cur1%RowType;
     
     
    BEGIN
    	/* Parcours des tables de la liste */
    	FOR V1 IN Cur1 LOOP
    		BEGIN
    			iter := 1;
    			colonnes_cle := '';
    			tab_colonnes_cle := type_tab();
    			requeteAnalyseCle := 'select t.* from ' || V1.nom_table;
     
    			dbms_output.put_line('	Parcours des informations de la table ' || V1.nom_table);
    			/* Récupération des noms de colonnes de la contrainte primaire (primary key) */
    			iter := 1;
    			requeteColonnesCle := 'select column_name from user_cons_columns where constraint_name in (select index_name from user_constraints where table_name = ''' || V1.nom_table || ''' and CONSTRAINT_TYPE=''P'')';
    			OPEN curseurColonnesCle FOR requeteColonnesCle;
    			LOOP
    				FETCH curseurColonnesCle INTO colonne;
    				EXIT WHEN curseurColonnesCle%NOTFOUND; 
    				tab_colonnes_cle.EXTEND;
    				tab_colonnes_cle(iter) := colonne;
    				colonnes_cle := colonnes_cle || colonne || ',';
    				iter := iter + 1;
    			END LOOP;
     
    			/* Parcours des enregistrements de la table */
    			requeteAnalyseCle := REPLACE(requeteAnalyseCle, 't.*', RTRIM(colonnes_cle, ','));
    			dbms_output.put_line(requeteAnalyseCle);
    		END;
    	END LOOP;
    END;
     
    /
     
    exit;
    Au final, ma variable requeteAnalyseCle contient la requête que je veux jouer mais je ne peux pas utiliser sys_refcursor (trouvé ici) , du moins pas avec une clause into car je ne peux pas donner le nombre de champs en sortie (différent à chaque table de la liste).

    Quelqu'un aurait-il une idée et surtout un bout de code? Car, j'ai bien quelques pistes sur internet (Execute immediate, bulk...) mais je n'arrive pas à adapter le code...

    Merci d'avance,

    JM

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Bonjour,

    Pour résumer ton problème c'est que tu ne connais pas à l'avance dans quelle structure tu va pouvoir fetcher ta requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    OPEN curseurColonnesCle FOR requeteAnalyseCle;
    LOOP
           FETCH curseurColonnesCle INTO <une structure indeterminée>;
           .....
    END LOOP;
    CLOSE curseurColonnesCle ;
    en tout cas ceci semble être impossible :
    http://download.oracle.com/docs/cd/B..._variables.htm

    PL/SQL makes sure the return type of the cursor variable is compatible with the INTO clause of the FETCH statement. For each column value returned by the query associated with the cursor variable, there must be a corresponding, type-compatible field or variable in the INTO clause. Also, the number of fields or variables must equal the number of column values. Otherwise, you get an error.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 86
    Par défaut
    J'avais bien peur que ce soit impossible et tu me le confirmes là, donc dommage pour moi, je vais chercher une autre méthode.

    Merci,

    JM

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

Discussions similaires

  1. Curseur avec requête en variable
    Par Pacman23 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 18/09/2008, 13h13
  2. [MySQL] BBD et nombre de champs inconnu
    Par Arkante dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/09/2008, 01h29
  3. Problème avec requête SQL avec variables
    Par harry25 dans le forum ASP
    Réponses: 1
    Dernier message: 03/01/2007, 03h41
  4. [SqlServer 2K] curseurs avec SELECT contenant des variables
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2006, 10h25
  5. Ouvrir un curseur avec une requête paramétrée?
    Par nnj dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2005, 14h12

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