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 :

paramètre de fonction dans un cursor


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut paramètre de fonction dans un cursor
    Bonjour,
    J'ai créé une fonction acceptant en paramètre le nom d'une table et dans la quelle j'ai un cursor avec lequel je souhaite utiliser ce paramètre mais j'ai une erreur de compilation; voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE 
      FUNCTION GroupConcat(concatTable IN VARCHAR2)
      RETURN varchar2 
    IS 
      varRetour VARCHAR2(2000) default '';
      CURSOR cConcat IS SELECT id  FROM concatTable;
    BEGIN	
      FOR x IN cConcat LOOP
    	varRetour := varRetour || to_char(x.id) || ',' ;
    	END LOOP; 
    	RETURN varRetour;
    END;
    /
    Si je supprime ma variable concatTable de ma requete SELECT et que j'écris un nom de table en dur ça fonctionne, mais moi je veux justement la paramétrer ! Auriez-vous une idée ? Je précise que je ne suis pas expert en PL/SQL.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bonjour.
    Dans la définition du curseur, concattable n'est pas considéré comme une variable. Je vous propose une autre façon d'utiliser un curseur.

    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 FUNCTION groupconcat (concattable IN VARCHAR2)
       RETURN VARCHAR2
    IS
       varretour   VARCHAR2 (2000) DEFAULT '';
       ls_requete  VARCHAR2 (100);
       ln_monid    NUMBER; -- je suppose que c'est un number, à changer éventuellement
    BEGIN
       ls_requete := 'SELECT ID FROM ' || concattable;
     
       OPEN mon_curseur FOR ls_requete;
       FETCH mon_curseur INTO ln_monid;
     
       WHILE mon_curseur%FOUND
       LOOP
          varretour := varretour || TO_CHAR (ln_monid) || ',';
     
          FETCH mon_curseur INTO ln_monid;
       END LOOP;
     
       CLOSE mon_curseur;
     
       RETURN varretour;
    END;
    /
    Edit: j'ai ajouté la fermeture du curseur.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Par défaut
    moi j'ai pensé utiliser le package dbms_sql.
    c clair que ce n'est pas la meilleure idée.
    Code SQL : 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 GroupConcat(concatTable IN VARCHAR2)
    IS
      v_string dbms_sql.varchar2_table; --g supposé ke id est de type varchar2
      cursor_name integer;
      v_cnt number;
      v_ignore number;
    BEGIN
      cursor_name:=dbms_sql.open_cursor;
      dbms_sql.parse(cursor_name,'SELECT id  FROM '||concatTable,dbms_sql.native);
      dbms_sql.define_array( cursor_name, 1, v_string , 100, 1 );
      v_ignore:=dbms_sql.execute(cursor_name);
      v_cnt :=dbms_sql.fetch_rows(cursor_name);
      dbms_sql.column_value( cursor_name, 1, v_string  );
      for i in 1..v_cnt
      loop
      dbms_output.put_line('valeur retour=>'||v_string(i));
      end loop;
    --fermeture du cursor
      dbms_sql.close_cursor(cursor_name);
    END;
    /

  4. #4
    Membre éclairé Avatar de Tanebisse
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Février 2007
    Messages : 449
    Par défaut
    Merci pour vos réponses, j'ai adopté une solution avec le nom de ma table en dur pour des soucis de rapidité, mais je vais potasser vos solutions.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/06/2013, 10h06
  2. Passer des paramètres à une fonction dans before_filter
    Par abir84 dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 27/01/2008, 19h40
  3. Changer un paramètre de fonction dans une boucle
    Par DeezerD dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 24/01/2008, 14h23
  4. Réponses: 10
    Dernier message: 02/02/2007, 16h00
  5. Passage de paramètre à une fonction dans un G_CALLBACK
    Par Dimitri_87 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 15/09/2006, 11h04

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