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 15/05/2008, 12h22   #1
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 0
Points : 0
Par défaut Cursor ne récupère lignes mais nom de la colonne

Bonjour,

Depuis quelque temps j'essaie de coder une procédure qui me permet de parcourir diférentes lignes d'une colonne afin de réaliser un filtrage sur des caractères spéciaux. Pour cela je définis un curseur qui est censé a récupérer les différentes lignes d'une colonne pour appliquer ce filtre.

Le problème que j'ai c'est que le curseur obtient le nom de la colonne au lieu de son contenu. Pour tant, quand j'exécute sur un client sql le select associé au curseur, l'ensemble de lignes est retourné.

Voici partie de ma procédure:
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
31
32
33
34
 
PROCEDURE FiltrageInterne
    (       
     COLONNE Varchar2
     ,NOMTABLE Varchar2
     ) AS
    --PRAGMA AUTONOMOUS_TRANSACTION;     
    v_counter	    		   number:=0;
    v_commit_update      number:=0;
    v_colonneCommande_aux VARCHAR2(4000);
   	v_update_remplace 		VARCHAR2(4000);
    col                   Varchar(1000):=COLONNE;
    tab                    varchar2(100):=NOMTABLE;
    contenuColonne                 CLOB;
    CURSOR  selectCursor IS SELECT col FROM tab;
    BEGIN    
    open selectCursor;
 
 
      loop
 
 	 DBMS_OUTPUT.PUT_LINE(col);
	 DBMS_OUTPUT.PUT_LINE(tab);
 
        fetch selectCursor INTO contenuColonne;
 
	 DBMS_OUTPUT.PUT_LINE(contenuColonne);
        DBMS_OUTPUT.PUT_LINE(DBMS_LOB.getlength(contenuColonne));
 
        v_commit_update:=v_commit_update+1;
        v_counter:=v_counter+1;
        v_colonneCommande_aux:=DBMS_LOB.SUBSTR(contenuColonne,4000,(4000*v_counter)+1);
 
          ...
La taille affiché est bien la taille de la colonne au lieu de son contenu.

Merci d'avance pour votre aide.
rcodtor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 13h34   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est le code exact ? Parce que tab est une vue du dictionnaire qui est all_tables. En gros tu vas lire le dico plutôt que ta table.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 14h04   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
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 320
Points : 5 839
Points : 5 839
Ca a l'air d'avoir besoin d'un Sql dynamique.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 14h10   #4
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 0
Points : 0
Oui voilà c'était bien ça, sauf que maintenant que j'ai modifié le nom de ma variable local, j'ai l'exception

Code :
PL/SQL: ORA-00942: TABLE ou vue inexistante



Et même si dans le select du curseur je référence directement le paramètre passé à la procédure (NOMTABLE) j'ai exactement la même erreur. Au fait, la variable local je l'avais déclarée pour éviter ce genre de problème car je restais bloqué sur mon développement, mais malheureusement je suis revenu au même point.
rcodtor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 14h21   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Non mais c'est ça qui est faux :
Code :
fetch selectCursor INTO contenuColonne;
Tu dois faire un truc du style :
Code :
1
2
fetch selectCursor INTO NomColonne;
EXECUTE IMMEDIATE 'SELECT ' || NomColonne || ' FROM ' || nomdetable INTO contenuColonne;
EXECUTE IMMEDIATE = SQL dynamique
Sachant que je ne sais pas d'où tu sors le nom de la table
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 14h32   #6
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 0
Points : 0
Merci, je vais essayer de faire et tester cette modification. Le nom de la table et celui de la colonne dont j'ai besoin sont passés en paramètre à la procédure, donc récupérés par le flux principal qui fait l'appel.
rcodtor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 17h27   #7
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 0
Points : 0
Au fait, le
Code :
EXECUTE IMMEDIATE... INTO..
n’est utilisé que pour les requêtes ne ramenant qu’une ligne, alors que j'ai besoin de travailler avec un ensemble de lignes, puis les parcourir pour appliquer le filtre d'une manière unitaire.

Mon problème venait de la déclaration du Curseur. J'ai lu dans la documentation que seul le nom de la table ne peut pas être passé via un argument de substitution, et c'était bien mon cas.

Vu que je connais les deux tables qui vont être passées en paramètre, j'ai décidé de créer deux curseurs et travailler avec l'un ou l'autre en fonction de la table recue (IF..Then else-> pas génial je pense).

Concernant le SQL dynamique j'ai essayé la ligne aussi le
Code :
fetch selectCursor Bulk collect INTO contenuColonne;
mais ça ne marchait pas non plus. Voici mon code jusqu'à maintenant avec lequel j'au toujours de soucis:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
PROCEDURE FiltrageInterne
    (       
     COLONNE Varchar2
     ,NOMTABLE Varchar2
     ) AS
    --PRAGMA AUTONOMOUS_TRANSACTION;     
    v_counter	    		  number:=0;
    v_commit_update      number:=0;
    v_colonneCommande_aux VARCHAR2(4000);
   	v_update_remplace 		VARCHAR2(4000);
    v_tab                 varchar2(100):=NOMTABLE;
    v_col               varchar2(100):=NOMTABLE;
    contenuColonne                 CLOB;
    CURSOR  CursorLotCommandes (LC$columna IN varchar2) IS SELECT LC$columna FROM ax_fop_e_lotdecommandes;
    CURSOR  CursorLotRetour (LC$columna IN varchar2) IS SELECT LC$columna FROM ax_fop_e_lotretour;
 
 
 
    BEGIN    
 
    IF (NOMTABLE='AX_FOP_E_LOTDECOMMANDES') then
      DBMS_OUTPUT.PUT_LINE('###LotdeCommandes###');
      open CursorLotCommandes (v_col);
    else 
		DBMS_OUTPUT.PUT_LINE('###LotRetour###');
		open CursorLotRetour(v_col);
    end IF;
 
 
 
      loop
 
       IF (NOMTABLE='AX_FOP_E_LOTDECOMMANDES') then
        fetch CursorLotCommandes INTO contenuColonne;
      else fetch CursorLotRetour INTO contenuColonne;
      end IF;
 
 
        --fetch selectCursor Bulk collect into contenuColonne;
 
 
       DBMS_OUTPUT.PUT_LINE(contenuColonne);
        DBMS_OUTPUT.PUT_LINE(DBMS_LOB.getlength(contenuColonne));
        v_commit_update:=v_commit_update+1;
        v_counter:=v_counter+1;
        v_colonneCommande_aux:=DBMS_LOB.SUBSTR(contenuColonne,4000,(4000*v_counter)+1);
 
    ...
Maintenant la variable contenuColonne vaut le nom de table.
rcodtor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 18h25   #8
Invité de passage
 
Inscription : mai 2008
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 6
Points : 0
Points : 0
D'après mes tests je constate que la variable LC$columna est considerée comme une constante et n'est pas interpretée lors de l'exécution.


L'idée serait donc de rendre la partie select des curseurs dynamique, point que je n'ai toujours pas résolu. Any help??
rcodtor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2008, 19h39   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
On va pas faire le dév pour toi non plus
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h58.


 
 
 
 
Partenaires

Hébergement Web