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 :

Execute Immediate dynamique


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut Execute Immediate dynamique
    Bonjour,

    je suis en version oracle 9i

    j'ai un probleme avec un execute immediate

    SousRequeteSQL := 'SELECT 1 FROM ' || TRIM(TT_Table)
    || ' WHERE ' || TRIM(TT_Lot)
    || ' = ' || '''' || TRIM(i_lot) ;
    RequeteSQL := 'UPDATE ' || TRIM(TM_Table)
    || ' SET ' || TRIM(TM_Integrer) || ' = 0 WHERE EXISTS ('
    || TRIM(SousRequeteSQL)
    || ')';

    EXECUTE IMMEDIATE RequeteSQL;

    mais il ne se passe rien, le update ne fonctionne pas

    ma requete est dans une procedure lancée via un batch sous pl/sql


    j'ai recuperer ma requete dans une variable
    et quand je la lance sous toad, la, ça fonctionne

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    As-tu fait un commit derrière ?

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    oui j'ai bien fait un commit

  4. #4
    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
    fait un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBMS_OUTPUT.PUT_LINE(RequeteSQL);
    Pour afficher la requête et vérifier qu'elle est correcte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    || ' = ' || '''' || TRIM(i_lot) ;
    il ne manque pas la fermeture des quotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    || ' = ' || '''' || TRIM(i_lot) || '''';

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    J'ai deja fait ca
    la requete est correcte
    elle fonctionne quand je la lance sous toad

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 61
    Par défaut
    Tu as essayé la fermeture des quotes comme le propose orafrance ?

  7. #7
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    oui j'ai essayée, c'est pareil

  8. #8
    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
    il faudrait le code complet :o

  9. #9
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    voici le code complet :

    CREATE OR REPLACE PROCEDURE PRC_Maj_Flag_Integrer_TM
    (
    i_lot IN VARCHAR2,
    i_PrefixeErreur IN VARCHAR2
    ) IS

    PrefixeErreur VARCHAR2(6);
    TT_Prefixe VARCHAR2(3);
    TT_Table VARCHAR2(30);
    TT_Colonne VARCHAR2(30);
    TT_Chrono VARCHAR2(30);
    TT_Lot VARCHAR2(30);
    TT_Integrer VARCHAR2(30);
    TM_Table VARCHAR2(30);
    TM_Colonne VARCHAR2(30);
    TM_Chrono VARCHAR2(30);
    TM_Lot VARCHAR2(30);
    TM_Integrer VARCHAR2(30);
    zTestUnderScore VARCHAR2(1);

    RequeteSQL VARCHAR2(1000);
    SousRequeteSQL VARCHAR2(500);

    BEGIN

    PrefixeErreur := i_PrefixeErreur || '%';
    IF (SUBSTR(PrefixeErreur, 2, 1) = '_') THEN
    zTestUnderScore := '_';
    ELSE
    zTestUnderScore := SUBSTR(PrefixeErreur, 2, 1);
    END IF;
    SELECT DISTINCT TEC_NOM_TABLE_CTRL,TEC_PREFIXE,
    TEC_NOM_COL_TABLE_SOURCE,TEC_NOM_TABLE_MAITRE,
    TEC_NOM_COL_TABLE_MAITRE
    INTO TT_Table,
    TT_Prefixe,
    TT_Colonne,
    TM_Table,
    TM_Colonne
    FROM &6..TEC_ERREURS_CODES
    WHERE TEC_CODE_ERREUR LIKE PrefixeErreur AND
    SUBSTR(TEC_CODE_ERREUR, 2, 1) = zTestUnderScore;

    TT_Chrono := TT_Prefixe || '_SASMIG_CHRONO';
    TT_Lot := TT_Prefixe || '_SASMIG_LOT';
    TT_Integrer := TT_Prefixe || '_SASMIG_A_INTEGRER';
    TM_Chrono := SUBSTR(TM_Colonne, 1, 3) || '_SASMIG_CHRONO';
    TM_Lot := SUBSTR(TM_Colonne, 1, 3) || '_SASMIG_LOT';
    TM_Integrer := SUBSTR(TM_Colonne, 1, 3) || '_SASMIG_A_INTEGRER';

    SousRequeteSQL := 'SELECT 1 FROM '
    || TRIM(TT_Table)
    || ' WHERE '
    || TRIM(TT_Lot)
    || ' = '
    || ''''
    || TRIM(i_lot)
    || ''''
    || ' AND '
    || TRIM(TT_Integrer)
    || ' = 0 AND '
    || TRIM(TM_Integrer)
    || ' = 1 AND '
    || TRIM(TT_Colonne)
    || ' = '
    || TRIM(TM_Colonne);
    RequeteSQL := 'UPDATE '
    || TRIM(TM_Table)
    || ' SET '
    || TRIM(TM_Integrer)
    || ' = 0 WHERE EXISTS ('
    || TRIM(SousRequeteSQL)
    || ')';
    EXECUTE IMMEDIATE RequeteSQL;
    COMMIT;

    END

  10. #10
    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
    essaye d'ajouter ceci :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    CREATE OR REPLACE PROCEDURE PRC_Maj_Flag_Integrer_TM
    (
    i_lot IN VARCHAR2,
    i_PrefixeErreur IN VARCHAR2
    ) IS
    nb_lig NUMBER;
    ...
    BEGIN
    ...
    SousRequeteSQL := 'SELECT count(*) FROM '
    || TRIM(TT_Table)
    || ' WHERE '
    || TRIM(TT_Lot)
    || ' = '
    || ''''
    || TRIM(i_lot)
    || ''''
    || ' AND '
    || TRIM(TT_Integrer)
    || ' = 0 AND '
    || TRIM(TM_Integrer)
    || ' = 1 AND '
    || TRIM(TT_Colonne)
    || ' = '
    || TRIM(TM_Colonne);
     
    EXECUTE IMMEDIATE RequeteSQL INTO nb_lig;
    DBMS_OUTPUT.PUT_LINE(nb_lig);
     
    SousRequeteSQL := 'SELECT 1 FROM '
    || TRIM(TT_Table)
    || ' WHERE '
    || TRIM(TT_Lot)
    || ' = '
    || ''''
    || TRIM(i_lot)
    || ''''
    || ' AND '
    || TRIM(TT_Integrer)
    || ' = 0 AND '
    || TRIM(TM_Integrer)
    || ' = 1 AND '
    || TRIM(TT_Colonne)
    || ' = '
    || TRIM(TM_Colonne);
    RequeteSQL := 'UPDATE '
    || TRIM(TM_Table)
    || ' SET '
    || TRIM(TM_Integrer)
    || ' = 0 WHERE EXISTS ('
    || TRIM(SousRequeteSQL)
    || ')';
    EXECUTE IMMEDIATE RequeteSQL;
    DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
     
    ...

  11. #11
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    je recupère bien mon nombre de ligne avec DBMS_OUTPUT
    mais ça ne change rien :
    la requete update marche sous toad
    mais pas via mon batch

  12. #12
    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
    à mon avis tu ne regardes pas la bonne table... tu utilises le même user ? Il n'y a pas de synonyme ?

  13. #13
    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 orafrance Voir le message
    à mon avis tu ne regardes pas la bonne table... tu utilises le même user ? Il n'y a pas de synonyme ?
    peut être je me trompe mais Bingo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    FROM &6..TEC_ERREURS_CODES
    ...

  14. #14
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    je suis bien sur le bon user
    et je n'ai pas de synonyme
    (ce sont des tables toutes créées dynamiquement)

  15. #15
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 14
    Par défaut
    non ce n'est pas un probleme de user

    j'ai essayée de mettre les &6.. partout mais ça donne pareil

    de plus, je n'ai aucun message d'erreur

  16. #16
    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
    Ajoutez (déjà demandé par orafrance)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DBMS_OUTPUT.PUT_LINE(RequeteSQL);
    dans ta procédure et poste la requête générée.

  17. #17
    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
    Citation Envoyé par mnitu Voir le message
    peut être je me trompe mais Bingo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    FROM &6..TEC_ERREURS_CODES
    ...
    En sql+, oracle te demande de remplacer le &6 par une valeur.
    En création de procédure, ça ne marche pas, vu que le code est précompilé.

    A mon avis, ta procédure n'est pas compilée.
    (et en plus il manque un ; au dernier END)

    Fais un show error.

  18. #18
    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 McM Voir le message
    En sql+, oracle te demande de remplacer le &6 par une valeur.
    En création de procédure, ça ne marche pas, vu que le code est précompilé.
    ...
    Si il exécute son script de création de la procédure par sqlplus, sqlplus va demander la valeur pour la variable de substitution et la procédure peut être crée avec succès. (bref, je n'aime pas du tout ça et de meilleures solutions existent pour attendre le même but).

Discussions similaires

  1. [sql dynamique] Erreur avec EXECUTE IMMEDIATE
    Par Foublanc1 dans le forum SQL
    Réponses: 0
    Dernier message: 06/05/2013, 14h46
  2. Select dynamique avec execute immediate
    Par BOLARD dans le forum SQL
    Réponses: 7
    Dernier message: 03/06/2008, 16h41
  3. Pb avec Execute IMMEDIATE et bloc dynamique
    Par ouaouane dans le forum SQL
    Réponses: 5
    Dernier message: 28/02/2008, 16h08
  4. [pl/sql] execute immediate
    Par Nadine dans le forum Oracle
    Réponses: 16
    Dernier message: 23/02/2005, 17h37
  5. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17

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