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 :

Requête dynamique en erreur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 1
    Par défaut Requête dynamique en erreur
    Bonjour à tous,

    Je suis bloqué sur un petit problème de syntaxe PL/SQL et malgré mes recherches sur le web rien à faire pour le résoudre.
    Il s'agit de la construction d'une requête dynamique.

    Voici le code de ma fonction :
    (Paramètres d'entrées de la fonction : CHAMPS vaut "TOTAL" et dans le ROWTYPE de la table t_proposals le champ P_PROPOSAL.TOTAL vaut 70)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FUNCTION FCT_EVAL_PROPOSALS(CHAMPS     IN VARCHAR2,
                                P_PROPOSAL IN T_PROPOSALS%rowtype) RETURN NUMBER IS
      n NUMBER;
      requete varchar2(100);
    BEGIN 
    requete := ' select P_PROPOSAL.'||CHAMPS||' from dual ';
     
      EXECUTE IMMEDIATE requete INTO n; 
      RETURN n;
     
    END FCT_EVAL_PROPOSALS;
    J'ai à chaque fois l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ORA-00904: "P_PROPOSAL"."TOTAL" : identificateur non valide
    ORA-06512: à "XXX.PCK_UTIL", ligne 920
    ORA-06512: à ligne 9
    Je m'y arrache les cheveux. J'ai essayé avec des curseurs mais ça donne le même problème. Le problème semble venir du fait que P_PROPOSAL est une variable, si c'était une table aucun problème (cf : http://www.fil.univ-lille1.fr/~durif...ml/PL-SQL.html chapitre 8.16.2)

    Quelqu'un aurait un conseil pour m'aider à faire tourner ce code?

  2. #2
    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
    Citation Envoyé par meshuggah666 Voir le message
    ...Quelqu'un aurait un conseil pour m'aider à faire tourner ce code?
    Il y a un tutoriel sur le SQL dynamique sur ce site.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    Ta requête sql est basée sur l'appel du dual. Comme tes chams sont à voir du type varchar2, il faut que tu ajoutes des comma '' sinon il interprète comme un nom de colonne qui n'existe pas.

    ATTENTION :FROM DUAL est un type bien particulier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FUNCTION FCT_EVAL_PROPOSALS(CHAMPS     IN VARCHAR2,
                                P_PROPOSAL IN T_PROPOSALS%rowtype) RETURN NUMBER IS
      n NUMBER;
      requete varchar2(100);
    BEGIN 
      requete := ' select '''' || P_PROPOSAL || '.'||CHAMPS||'''' from dual ';
     
      EXECUTE IMMEDIATE requete INTO n; 
      RETURN n;
     
    END FCT_EVAL_PROPOSALS;

  4. #4
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Par défaut
    Voici un exemple avec ton 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    SET SERVEROUTPUT ON;
     
    declare
     RESUL NUMBER;
     
      FUNCTION FCT_EVAL_PROPOSALS(CHAMPS     IN VARCHAR2,
                                  P_PROPOSAL IN VARCHAR2) RETURN NUMBER IS
        n NUMBER;
        requete varchar2(100);
        c1 sys_refcursor;
      BEGIN 
        requete := 'select ''' || P_PROPOSAL || '.'||CHAMPS||''' from dual';
     
        DBMS_OUTPUT.PUT_LINE(requete);
     
        EXECUTE IMMEDIATE requete INTO n; 
        RETURN n;
     
      END;
     
     
     
    begin
     
      RESUL := FCT_EVAL_PROPOSALS(1,1);
      DBMS_OUTPUT.PUT_LINE('RESULTAT = ' || to_char(RESUL));
    end;

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Quelle est l'utilité d'utiliser la pseudo-table DUAL ? Pourquoi ne pas directement contaténer dans une chaîne ?

Discussions similaires

  1. Requête sur une requête dynamique...
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 17/11/2005, 19h59
  2. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29
  5. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04

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