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

SQL Oracle Discussion :

Cursor ne récupère lignes mais nom de la colonne


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    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 : 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
     
    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.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    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.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    Ca a l'air d'avoir besoin d'un Sql dynamique.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Par défaut
    Oui voilà c'était bien ça, sauf que maintenant que j'ai modifié le nom de ma variable local, j'ai l'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Non mais c'est ça qui est faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fetch selectCursor INTO contenuColonne;
    Tu dois faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Par défaut
    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.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 6
    Par défaut
    Au fait, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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.

Discussions similaires

  1. [MySQL] Erreur d'argument sur une ligne mais quelle
    Par spirou34fr dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/01/2007, 07h24
  2. [SQL2K] recopier une ligne, mais pas complètement
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2006, 12h54
  3. Ouvrir document mais nom du fichier incomplet
    Par ljiang dans le forum 4D
    Réponses: 1
    Dernier message: 22/09/2006, 14h04
  4. [MySQL] changer du texte soi-même en ligne, mais....?
    Par midiweb dans le forum Administration
    Réponses: 7
    Dernier message: 16/03/2006, 07h47
  5. [import] Excel et ligne de noms des champs
    Par babar01 dans le forum Access
    Réponses: 2
    Dernier message: 05/10/2005, 15h46

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