Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/02/2008, 16h31   #1
Invité de passage
 
Inscription : février 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2
Points : 1
Points : 1
Par défaut un curseur dynamique où le nom de la table est un argument

Bonjour,

La réponse peut être évidente, je m'en excuse d'avance si tel est le cas. Ma question est la suivante. J'ai écrit une procédure ont le but est de purger divers tables. Les traitements de purges étant sensiblement les mêmes d'une table à une autre, je souhaite factoriser mon code. Le problème est que visiblement il n'est pas possible dans un curseur dynamique de déclarer la table comme un paramètre... Ci_dessous, la portion de code posant problème :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
PROCEDURE purge_table(SITE              IN NUMBER,
                      TABLE_NAME        IN VARCHAR2,
                      TABLE_COLUMN_SITE IN VARCHAR2,
                      TABLE_COLUMN_DATE IN VARCHAR2,
                      TABLE_PARAM       IN NUMBER,
                      POSTE_PARAM       IN NUMBER,
                      P_RETOUR          OUT NUMBER) IS
 
  delai number;
  CURSOR C_TABLE(p_delai number, p_site number) IS
    SELECT t.rowid
      FROM TABLE_NAME t
     WHERE trunc(TABLE_COLUMN_DATE) < sysdate - p_delai
       AND TABLE_COLUMN_SITE = p_site;
...
Avez vous une idée ?

D'avance, merci pour votre contribution.
morif1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 16h50   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 319
Points : 5 837
Points : 5 837
Je ne vois pas de curseur dynamique mais toute simplement un curseur statique avec des paramètres.
Il n’y pas de problème en cas d’utilisation d’un curseur dynamique pour modifier le nom de la table vu que la requête exécute par le curseur dynamique est formée à partir d’une chaîne de caractères. Par contre il n’est pas possible d’utiliser un paramètre pour spécifier le nom de la table.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 17h21   #3
Invité de passage
 
Inscription : février 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2
Points : 1
Points : 1
Merci pour ta réponse. ;-)
morif1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 13h46   #4
Membre régulier
 
Inscription : septembre 2005
Messages : 71
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 71
Points : 72
Points : 72
Hello,

Heuu je ne comprends pas bien la réponse de mnitu ?! En effet "morif 1" il y a un problème ici la proc ne sera jamais valide puisque imcompilable... et pour cause TABLE_NAME n'existe pas...
Donc ça donne plutôt :

Code :
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
 
SQL> SET serveroutput ON
SQL> /
 
Procedure created.
 
SQL> l
  1  CREATE OR REPLACE procedure test
  2  ( table_name IN varchar2 ) IS
  3  sqlcur varchar2(255);
  4
  5  TYPE mon_curseur_type IS ref cursor;
  6  mon_curseur            mon_curseur_type;
  7  mon_buffer             varchar2(4000);
  8
  9  BEGIN
 10  sqlcur := 'select  * from ' || table_name ;
 11  open mon_curseur FOR sqlcur;
 12  loop
 13  fetch mon_curseur INTO mon_buffer;
 14  exit when mon_curseur%NOTFOUND;
 15  dbms_output.put_line (mon_buffer);
 16  end loop;
 17* END;
SQL> execute test ('DUAL');
X
 
PL/SQL procedure successfully completed.
 
SQL>
Voila voili...
Tracnac est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h30.


 
 
 
 
Partenaires

Hébergement Web