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 :

[PL/SQL] Nom de table et de champs paramétrés


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Par défaut [PL/SQL] Nom de table et de champs paramétrés
    Salut à tous !
    J'ai eu du mal à trouver un titre court et clair pour mon problème !
    Etant donné que je débute, mon probléme parait peut être tout con mais j'ai pas trouver cela sur le forum et encore moins sur la doc...
    J'ai une procédure stockée qui prend plusieurs paramètres et qui créer une requête en fonction de ces derniers (c'est pas pour le fun si je passe par une procédure stockée, c'est une histoire de taille des paramètres...). Le soucis c'est que je voudrais passer le nom de la table et le nom de certains champs en paramètre histoire de rendre un peu plus générique mon application et du coup ma requête a cette allure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO PARAM1 (PARAM2, PARAM3) VALUES (.........
    Si je fait ça il me dit qu'il connaît pas le nom de la table, donc il considère pas cela comme un paramètre (même avec les guillemets) et pour les champs il me dis que l'opération est invalide (même avec les guillemets)...
    Est qu'il y a une solution pour faire cela ? Si oui, comment puis-je faire ?

    Merci de vos réponses et @ très vite !
    Antoine

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Recherche EXECUTE IMMEDIATE

  3. #3
    Membre éclairé Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Par défaut
    Salut McM, merci de ta réponse, ça commence à aller mieux mais un petit problème persiste : voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	requete VARCHAR2(512);
    	total PLS_INTEGER;
    	BEGIN		
    		requete :=
    		'INSERT INTO' || NOMTABLE || '(' || IDCOLONNE || ',' || GEOMCOLONNE || ') VALUES (CLE, MDSYS.SDO_GEOMETRY(TYPEGEOM, SPATIALREF, NULL, elem, ord))';
    		EXECUTE IMMEDIATE requete INTO total;
     
    		COMMIT;
    Ce que tu ne vois pas défini l'est avant dans le programme (elem, ord, TYPEGEOM, ...), je sais que ça fonctionne puisque avant que je fasse un EXECUTE IMMEDIATE, cela fonctionnait ! J'ai laisser ce qui est intéressant !
    Quand j'exécute cette requête, Oracle lève une exception me disant :
    ORA-00925: missing INTO keyword
    ORA-06512: at "NANTES.PACKAGE1", line 29
    ORA-06512: at line 1

    Le INTO y est... j'ai regardé la syntaxe et j'ai vu qu'on pouvais ne pas le mettre ou en mettre plusieurs mais je n'y arrive pas, j'ai toujours cette erreur... Je ne sais pas bien à quoi sert ce INTO, il me semblais que ça récupéré quelque chose mais je m'en fou de récupérer puisque c'est un INSERT INTO ou UPDATE...
    Quelqu'un pourrais m'éclairer la dessus, car je patauge un peu
    Merci et @+
    Antoine

  4. #4
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Il faut le virer, tout simplement ! (le INTO)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXECUTE IMMEDIATE <requete> ;
    Le message d'erreur est sur le INTO de l'insert : il manque un espace avant INTO !
    [code]
    'INSERT INTO' || NOMTABLE || '(' || IDCOLONNE ||
    /code]

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Il manque un espace après le mot clé 'INTO'.
    Faîtes un DBMS_OUTPUT.PUT_LINE de la chaîne que vous transmettez à EXECUTE IMMEDIATE et vous localiserez plus facilement votre(vos) erreur(s).

    Enfin, pour des raisons de performances, utilisez des binds variables avec execute immediate.

  6. #6
    Membre éclairé Avatar de NeraOne
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 218
    Par défaut
    Le message d'erreur porté sur la ligne suivante... bon enfin du coup ça à marché ! Désolé pour cette oubli ! Comme un malheur ne vient jamais seul, vous vous doutez bien que la requête ne s'éxecute pas encore correctement...
    J'ai essayer de deux façon, avec des binds, il me semble que c'est genre une requête paramétrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'INSERT INTO :tableNom (:idCol, :geomCol) VALUES (:id , MDSYS.SDO_GEOMETRY(:type, :srid, NULL, :eleminfo, :ordinate ));';
    DBMS_OUTPUT.PUT_LINE(requete);
    EXECUTE IMMEDIATE requete USING NOMTABLE, IDCOLONNE, GEOMCOLONNE, CLE, TYPEGEOM, SPATIALREF, elem, ord;
    il me dis :
    ORA-00903: invalid table name
    ORA-06512: at "NANTES.PACKAGE1", line 31
    ORA-06512: at line 1

    (à l'exécution)
    la ligne 31 c'est celle de l'EXECUTE IMMEDIATE ! Pour avoir vérifier, le paramètre passe bien depuis mon code source (C#) et j'ai essayer de vérifier dans la procédure avec DBMS_OUTPUT.PUT_LINE(requete); mais ça marche pas enfin ya rien qui s'affiche, je sais pas où ça doit s'afficher mais dans la fenêtre de sortie d'oracle, rien... même pas mes DBMS_OUTPUT.PUT_LINE("coucou"); donc je peux pas vérifier cela et je comprend pas pourquoi ça passe pas...
    J'ai essayer avec la méthode que j'avais adopter au début, un genre de concaténation (on va appeler ça comme ça) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete :=
    'INSERT INTO ' || NOMTABLE || ' ( '|| IDCOLONNE || ' , ' || GEOMCOLONNE || ' ) VALUES ( ' || CLE || ' , MDSYS.SDO_GEOMETRY(' || TYPEGEOM || ' , ' || SPATIALREF || ' , NULL, ' || elem || ' , ' || ord || ' ));';
    EXECUTE IMMEDIATE requete;
    La il me dit que mes deux tableaux associatifs elem et ord n'ont pas le bon type (à la compilation : PLS-00306: wrong number or types of arguments in call to '||') alors j'ai fait un mix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requete :=
    'INSERT INTO ' || NOMTABLE || ' ( '|| IDCOLONNE || ' , ' || GEOMCOLONNE || ' ) VALUES ( ' || CLE || ' , MDSYS.SDO_GEOMETRY(' || TYPEGEOM || ' , ' || SPATIALREF || ' , NULL, :eleminfo, :ordinate ));';
    EXECUTE IMMEDIATE requete USING elem, ord;
    et la il me dis
    ORA-00911: invalid character
    ORA-06512: at "NANTES.PACKAGE1", line 35
    ORA-06512: at line 1

    (à l'exécution)
    la ligne 35 c'est celle de l'execute immediate...
    Je sais plus quoi faire là...

  7. #7
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    C'est donc que tu concatenes des variables dont certaines sont des NUMBER (en tout cas pas des varchar2).

    Peut-etre CLE ?

    Verifie tes types de donnees (idcolonne, etc)



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

Discussions similaires

  1. [Débutant] LINQ to SQL : Nom de table variable.
    Par def_msy dans le forum C#
    Réponses: 5
    Dernier message: 07/07/2011, 16h44
  2. [A-03]SQL-Nom de table comme paramètre
    Par AndréPe dans le forum VBA Access
    Réponses: 5
    Dernier message: 04/03/2009, 17h29
  3. [ADO] Récupérer le nom des Tables et des champs
    Par Kephuro dans le forum Bases de données
    Réponses: 2
    Dernier message: 02/06/2008, 17h04
  4. erreur nom de table ou de champ inconnu
    Par olam37 dans le forum 4D
    Réponses: 2
    Dernier message: 03/04/2008, 15h25
  5. nom de table et de champs avec des espaces
    Par grinder59 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/05/2006, 17h30

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