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 :

[8i][PL/SQL] EXECUTE IMMEDIATE


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut [8i][PL/SQL] EXECUTE IMMEDIATE
    Bien le bonjour à toutes et à tous.

    Je me pose quelques questions relatives à EXECUTE IMMEDIATE; Mon code est le suivant :

    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
    DECLARE
        vRequete            VARCHAR2(300);
        vErrMajMaTable    EXCEPTION;
    BEGIN
        IF(premiere condition) THEN
            vRequete := 'INSERT INTO MaTable
                (
                    MonChamp1
                    , MonChamp2
                )
                VALUES
                (
                    '||MaVariable1||'
                    , '||MaVariable2||'
                )';
        ELSE
            vRequete := 'UPDATE MaTable
                SET 
                    MonChamp1 = '||MaVariable1||'
                    , MonChamp2 = '||MaVariable2||'
                WHERE gnagnagna ';
        END IF;
    
        EXECUTE IMMEDIATE vRequete;
    
        IF(SQL%NOTFOUND) THEN
            RAISE vErrMajMaTable;
        END IF;
    
    EXCEPTION
        WHEN vErrMajMaTable THEN
            FonctionQuiTraceErreur(prend en argument la requete);
        blablabla;
    END;
    J'ai l'erreur suivante qui pointe sur la ligne en rouge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-06502 : erreur numerique ou erreur sur une valeur.
    Je ne sais pas trop où est le problème puisque j'ai bien déclaré ma variable vRequete, la longueur est bonne qui plus est.

    Bon sinon, j'ai d'autres questions concernant EXECUTE IMMEDIATE.
    - Est-ce que la requete passée en paramètre doit se terminer par un ";"
    - De quel type doit être cette variable ?

    merci d'avance

    Bahan

  2. #2
    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
    Pourquoi ne pas la déclarer d'entrée en Varchar(4000) ?....

  3. #3
    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
    Citation Envoyé par Bahan
    Bon sinon, j'ai d'autres questions concernant EXECUTE IMMEDIATE.
    - Est-ce que la requete passée en paramètre doit se terminer par un ";"
    - De quel type doit être cette variable ?
    le ; final ne doit être indiqué que pour un block 'BEGIN Instruction... END ;'

    cette variable est forcément une chaine de caractères.

  4. #4
    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
    de plus, je vous conseille de faire démarrer les lignes contenues dans la chaine en colonne 1.

  5. #5
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Merci de votre prompte réponse.
    Cela m'a permis de faire disparaître ma première erreur.

    Cependant, une nouvelle est apparue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00932 : Type de données incohérents
    Au niveau de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE vRequete;
    Bahan

  6. #6
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Ok pour la colonne 1.
    cf mon premier post.
    Cependant, mon erreur soulevée dans mon post #5 est toujours là.

    A noter que j'avais oublié sur le forum de mettre les '|| et ||' autour de mes variables dans ma requête (mais je n'avais pas oublié de les mettre dans mon code).

    Bahan

  7. #7
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Il semblerait que tout le problème vienne de ce petit bout de code issu de ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'AND MonChampDate = TRUNC('||MaVariableDate||')'
    C'est certainement parce qu'il n'y a pas de " ' " qui l'encadre j'imagine. Mais comment pallier à ce problème ? Existe-t-il en PLSQL un caractère permettant de "protéger" d'autres caractères.

    Bahan

  8. #8
    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
    Pouvez-vous donc poster le code corrigé ?

  9. #9
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    Voici :

    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
    DECLARE
        vRequete            VARCHAR2(4000);
        vErrMajMaTable    EXCEPTION;
        vMaVariable1        NUMBER;
        vMaVariable2        DATE;
    BEGIN
        IF(premiere condition) THEN
            vRequete := 'INSERT INTO MaTable
                (
                    MonChamp1
                    , MonChamp2
                )
                VALUES
                (
                    '||vMaVariable1||'
                    , '||vMaVariable2||'
                )';
        ELSE
            vRequete := 'UPDATE MaTable
                SET 
                    MonChamp1 = '||vMaVariable1||'
                    , MonChamp2 = '||vMaVariable2||'
                WHERE gnagnagna ';
        END IF;
    
        EXECUTE IMMEDIATE vRequete;
    
        IF(SQL%NOTFOUND) THEN
            RAISE vErrMajMaTable;
        END IF;
    
    EXCEPTION
        WHEN vErrMajMaTable THEN
            FonctionQuiTraceErreur(prend en argument la requete);
        blablabla;
    END;
    Ici, MaVariable2 est une date et c'est cela qui pose problème car quand je l'enlève je n'ai plus l'erreur d'incohérence du type de données.

    Quel est le caractère de neutralisation en PLSQL ? Ce n'est pas '\', ça c'est certain

    Bahan

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

Discussions similaires

  1. [Oracle 9iR2][PL/SQL] EXECUTE IMMEDIATE USING
    Par mainecoon dans le forum Oracle
    Réponses: 4
    Dernier message: 08/02/2007, 19h08
  2. SQl loader et execute immediate
    Par salim_kwada dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 31/08/2006, 13h30
  3. [PL/SQL] EXECUTE IMMEDIATE et INSERT et RETURNING
    Par swirtel dans le forum Oracle
    Réponses: 2
    Dernier message: 18/04/2006, 09h25
  4. [PL/SQL] Execute immediate
    Par BiM dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/08/2005, 11h13
  5. [pl/sql] execute immediate
    Par Nadine dans le forum Oracle
    Réponses: 16
    Dernier message: 23/02/2005, 17h37

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