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 :

Problème d'insert en SQL dynamique


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut Problème d'insert en SQL dynamique
    Bonjour,

    Je crée une table via une procédure en SQL dynamique (ca fonctionne).

    J'insère des données via la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    request := 'insert into TBL_DIAG_CODE_' || tblRef ||' (ncDiagCode, ncMotif, ncSousMotif, ';
    request := request || 'ncActionType, swDateCreated, ncDiagCodeId) values ( ';
    request := request || '''' || t_ncDiagCode(i) || ''', ';
    request := request || '''' || t_ncMotif(i) || ''', ';
    request := request || '''' || t_ncSousMotif(i) || ''', ';
    request := request || '''' || t_ncActionType(i) || ''', ';
    request := request || '''' || t_swDateCreated(i) || ''', ';
    request := request || t_ncDiagCodeId(i) || ')';
     
    execute immediate request;
    Lorsque ce code est exécuté, la table reste vide. Lorsque je débugge la procédure et que je fais un copier/coller de la valeur contenue dans la variable "'request" et que je l'exécute manuellement, cela fonctionne.

    Par avance merci de votre aide.

    Greg

  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
    t'a pensé au COMMIT ?

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut
    Oui. J'avais rajouté un "execute immediate 'commit';" mais ca ne change rien.

  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
    Citation Envoyé par greg75 Voir le message
    Oui. J'avais rajouté un "execute immediate 'commit';" mais ca ne change rien.
    Il ne faut pas faire "execute immediate 'commit';"
    Mais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    COMMIT;
    ....

  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
    l'affichage de la requête via DBMS_OUTPUT est souvent très utile

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Alerte aux variables de lien !

    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
    request := 'insert into TBL_DIAG_CODE_' || tblRef ||' (ncDiagCode, ncMotif, ncSousMotif, ';
    request := request || 'ncActionType, swDateCreated, ncDiagCodeId) values ( ';
    request := request || '''' || :ncDiagCode || ''', ';
    request := request || '''' || :ncMotif || ''', ';
    request := request || '''' || :ncSousMotif || ''', ';
    request := request || '''' || :ncActionType || ''', ';
    request := request || '''' || :swDateCreated || ''', ';
    request := request || :ncDiagCodeId || ')';
     
    execute immediate request
    using t_ncDiagCode(i),
        t_ncMotif(i),
        t_ncSousMotif(i),
        t_ncActionType(i),
        t_swDateCreated(i),
        t_ncDiagCodeId(i);
    Sans variable de lien vos requêtes ne restent pas dans le SHARED POOL ce qui entraine de lourdes dégradations de perfs, et en plus elles font sortir du shared pool les requêtes "bien écrites" .

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::11_QUESTION_ID:2588723819082
    http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::11_QUESTION_ID:104931400346587790

    De plus, pas de variable de lien = risque d'injection SQL

    rbaraer

  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
    Attention, si utilisation de variables de lien (bind variable) modifier la requête (pas de quotes) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    request := 'insert into TBL_DIAG_CODE_' || tblRef ||' (ncDiagCode, ncMotif, ncSousMotif, ';
    request := request || 'ncActionType, swDateCreated, ncDiagCodeId) values ( ';
    request := request || ':ncDiagCode , :ncMotif ,:ncSousMotif , ';
    request := request || ':ncActionType ,:swDateCreated , :ncDiagCodeId )';
    execute immediate request
    using t_ncDiagCode(i),
        t_ncMotif(i),
        t_ncSousMotif(i),
        t_ncActionType(i),
        t_swDateCreated(i),
        t_ncDiagCodeId(i);
    COMMIT;

  8. #8
    Membre averti
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Par défaut
    Merci à tous, maintenant ca fonctionne. Vous êtes des chefs

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par Garuda Voir le message
    Attention, si utilisation de variables de lien (bind variable) modifier la requête (pas de quotes) !
    Ah oui merci. Désolé je suis allé un peu vite .

    rbaraer

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

Discussions similaires

  1. problème d'insertion pl/sql
    Par soub dans le forum PL/SQL
    Réponses: 2
    Dernier message: 03/10/2009, 20h29
  2. problème d'insertion en sql
    Par elissa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2007, 13h49
  3. Probléme Insert sql dynamique
    Par Xavier2701 dans le forum Oracle
    Réponses: 10
    Dernier message: 26/09/2006, 17h32
  4. problème d'insertion sur une BD SQL server 2000
    Par offspring140 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 22/05/2006, 11h11
  5. Réponses: 4
    Dernier message: 30/01/2005, 14h23

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