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 :

Mettre en parametre d'une fonction le nom d'une colonne


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Mettre en parametre d'une fonction le nom d'une colonne
    Bonjour,

    J'essaye de mettre en parametre le nom d'une colonne pour ensuite l'utiliser dans ma requete. Mais cela ne fonctionne pas.
    L'erreur suivante m'est retournée :
    ORA-01722: invalid number
    ORA-06512: at "SFFPF.F_BMW_GET_PRIME", line 7

    lorsque j'appelle la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE FUNCTION F_BMW_GET_PRIME(TypeMontant VARCHAR2) 
    RETURN NUMBER
    IS
    TOTAL NUMBER;
    BEGIN
    	SELECT 	SUM(TypeMontant)
    	INTO	TOTAL
    	FROM	MOUVEMENT;
    RETURN TOTAL;		
    END F_BMW_GET_PRIME;
    Est-ce que quelqu'un sait s'il est possible d'utiliser dans une requete le nom d'un champ passé en parametre ?
    Ou alors une petite idée sur mon erreur ?

    Merci
    Suzanne

    Balises code ajoutées par Orafrance, merci d'y penser

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE FUNCTION F_BMW_GET_PRIME(TypeMontant VARCHAR2)
    RETURN NUMBER
    IS
    TOTAL NUMBER;
    BEGIN
       EXECUTE IMMEDIATE 'SELECT    SUM('|| TypeMontant || ') FROM   MOUVEMENT' INTO total;
     
    RETURN TOTAL;      
    END F_BMW_GET_PRIME;
    cf. http://sheikyerbouti.developpez.com/...mmediate/#L4.3

  3. #3
    Membre averti Avatar de Cerberes
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 328
    Points : 338
    Points
    338
    Par défaut
    Ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE FUNCTION F_BMW_GET_PRIME(TypeMontant VARCHAR2)
    RETURN NUMBER
    IS
    LMD VARCHAR2(100);
    TOTAL NUMBER;
    BEGIN
       LMD:= 'SELECT SUM('|| TypeMontant || ') FROM MOUVEMENT';
       EXECUTE LMD INTO TOTAL;
    RETURN TOTAL;     
    END F_BMW_GET_PRIME;
    Nota: j'ai mis ce code car orafrance, vous avez oubliez de fermer un guillemet après la première concaténation de charactères...
    Merci d'éviter les UP et autres messages inutiles!
    Modérateur Informatique Générale (même si je me mets au Delphi)
    N'oubliez pas les règles!
    Mon adresse e-mail

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Super !!!!!!!!
    Merci beaucoup

    Suzanne

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    effectivement... j'ai corrigé mon message

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je souhaite faire à peu pres la même chose que dans ce topic mais ça ne fonctionne pas et je ne trouve pas mon erreur

    Alors j'ai essayé ça :
    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
     
    CREATE OR REPLACE
    PROCEDURE     MATCH_CLASSIF(colclassif VARCHAR2,testnb NUMBER) AS
    TYPE t_Cursor IS REF CURSOR;
        C1 t_Cursor;
        pNumber T_CDQ.gsi_party_number%TYPE;
        pName T_CDQ.gsi_party_name%TYPE;
        oldclassif VARCHAR2(255);
        newclassif T_CLASSIF.classification%TYPE;
        pCertif T_CDQ.party_certification%TYPE;
        aNumber T_CDQ.account_number%TYPE;
        aStatus T_CDQ.account_status%TYPE;
        industryCat T_CDQ.industry_category%TYPE;
        requete VARCHAR2(1000);
    BEGIN
        execute immediate 'drop table T_MATCH_CLASSIF';
        execute immediate 'create table T_MATCH_CLASSIF(gsi_party_number VARCHAR2(100), gsi_party_name VARCHAR2(255), '||colclassif||' VARCHAR2(255), new_classification VARCHAR2(255), party_certification VARCHAR2(255), account_number VARCHAR2(100), account_status VARCHAR2(255), industry_category VARCHAR2(255))';
         IF (testnb=1) THEN
          requete:='OPEN C1 FOR
              SELECT gsi_party_number, gsi_party_name, :1, classification, party_certification, account_number, account_status, industry_category
              FROM T_CDQ,T_CLASSIF
              WHERE gsi_party_number=registry_id
              AND gsi_party_name=business_name;';
              execute immediate requete USING colclassif;
          ELSIF (testnb=2) THEN
            requete:='OPEN C1 FOR
              SELECT gsi_party_number, gsi_party_name, :1, classification, party_certification, account_number, account_status, industry_category
              FROM T_CDQ,T_CLASSIF
              WHERE gsi_party_number=registry_id
              AND gsi_party_name<>business_name;';
              execute immediate requete USING colclassif;
          END IF;
     
        LOOP
          EXIT WHEN C1%NOTFOUND;
          FETCH C1 INTO pNumber,pName,oldclassif,newclassif,pCertif,aNumber,aStatus,industryCat;
          INSERT INTO T_MATCH_CLASSIF VALUES(pNumber,pName,oldclassif,newclassif,pCertif,aNumber,aStatus,industryCat);
          COMMIT;
        END LOOP;
        CLOSE C1;
    END;
    La creation de la table marche impec, il me créé correctement la colonne avec le nom que je lui passe en parametre. Par contre dans le slect du curseur ça ne fonctionne pas.
    Est ce que vous auriez une idée d'où ça peut venir ?

    J'utilise une base Oracle 10g.

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          requete:='OPEN C1 FOR
              SELECT gsi_party_number, gsi_party_name, :1, classification, party_certification, account_number, account_status, industry_category
              FROM T_CDQ,T_CLASSIF
              WHERE gsi_party_number=registry_id
              AND gsi_party_name=business_name;';


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          requete:='SELECT gsi_party_number, gsi_party_name, :1, classification, party_certification, account_number, account_status, industry_category
              FROM T_CDQ,T_CLASSIF
              WHERE gsi_party_number=registry_id
              AND gsi_party_name=business_name';
    pas de ; à la fin de la chaine de caractère et encore moins de curseur (quelle idée )

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Et du coup comment je peux lancer mon curseur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate requete USING colclassif;
    Ah et dsl pour les erreurs betes.. je debute..

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    tu dois ouvrir un curseur sur la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    requete:='SELECT gsi_party_number, gsi_party_name, '|| colclassif ||', classification, party_certification, account_number, account_status, industry_category
              FROM T_CDQ,T_CLASSIF
              WHERE gsi_party_number=registry_id
              AND gsi_party_name=business_name';
     
    For ligne INTO requete

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup !!
    ça marche nickel !!

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 19/01/2011, 10h00
  2. passer le nom d'une fonction comme paramètre d'une autre fonction?
    Par med_alpa dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/03/2010, 12h57
  3. prendre le retour d'une fonction comme nom d'une constante
    Par Syphys dans le forum Général Java
    Réponses: 7
    Dernier message: 26/11/2009, 13h10
  4. Nom d'une variable passée en paramètre à une fonction
    Par cata2 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 07/09/2007, 09h17
  5. Réponses: 9
    Dernier message: 22/08/2007, 12h25

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