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

PL/SQL Oracle Discussion :

Variable CHAR dans EXECUTE IMMEDIATE [9i]


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut Variable CHAR dans EXECUTE IMMEDIATE
    Bonjour,

    J'arrive à créer correctement la procédure stockée suivante :

    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
    CREATE OR REPLACE PROCEDURE PH_SEQ5
        (
            MyPeriode CHAR
        )
     
    IS
     
        -- Déclaration variables locales
        stSql VARCHAR2(3000);
     
        BEGIN
            stSql:='CREATE OR REPLACE VIEW PH_VUE_TEMP AS SELECT * FROM PH_EMI_AG WHERE TRTPER_PNU='||MyPeriode;
            EXECUTE IMMEDIATE (stSql);
        END;
     
    /
    Mais à l'exécution avec une variable alphanumérique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL PH_SEQ5('2012H38');
    J'obtiens l'erreur :
    CALL PH_SEQ5('2012H38')
    Error at line 33
    ORA-00933: SQL command not properly ended
    ORA-06512: at "A263.PH_SEQ5", line 17
    Si j'exécute le code suivant ça marche : Dans la table PH_EMI_AG, le champ TRTPER_PNU est de type VARCHAR2(7).

    J'ai essayé différentes combinaisons avec les quotes sans succès.

    Si quelqu'un a une idée, je suis preneur.

    Merci.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Comme bien souvent, afficher la chaîne à exécuter vous mettra la puce à l'oreille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE PROCEDURE PH_SEQ5 (MyPeriode CHAR)
    IS
        -- Déclaration variables locales
        stSql VARCHAR2(3000);
     
        BEGIN
            dbms_output.enable;
            stSql:='CREATE OR REPLACE VIEW PH_VUE_TEMP AS SELECT * FROM PH_EMI_AG WHERE TRTPER_PNU='||MyPeriode;
            dbms_output.put_line (stSql);
            -- EXECUTE IMMEDIATE (stSql);
        END;
    /

  3. #3
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Merci Waldar, j'y ai bien pensé mais je ne vois pas le résultat du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put_line (stSql);
    s'afficher.

    J'ai essayé de mettre mais je n'ai pas réussi à voir la valeur de stSql.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Même avec le dbms_output.enable dans la procédure stockée ?

  5. #5
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    Je viens de voir la valeur de stSql.

    Il manque des quotes avant et après.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Enfin sinon je vous le fais le dbms_output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CALL PH_SEQ5('2012H38');
     
    CREATE OR REPLACE VIEW PH_VUE_TEMP AS SELECT * FROM PH_EMI_AG WHERE TRTPER_PNU=2012H38
     
    CALL PH_SEQ5(4);
     
    CREATE OR REPLACE VIEW PH_VUE_TEMP AS SELECT * FROM PH_EMI_AG WHERE TRTPER_PNU=4

  7. #7
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    C'est bon,
    ça marche avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     stSql:='CREATE OR REPLACE VIEW PH_VUE_TEMP AS SELECT * FROM PH_EMI_AG WHERE TRTPER_PNU='''||MyPeriode||'''';
    Merci.

    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Maintenant que le problème de départ est résolu, j'attire votre attention sur la relative inutilité de cette procédure, je ne comprends pas vraiment la nécessité de créer un objet Oracle simplement pour appliquer un filtre.

  9. #9
    Membre averti Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Points : 334
    Points
    334
    Par défaut
    Et plus généralement, mettre des DDL (CREATE TABLE, CREATE VIEW, etc.) à l'intérieur de EXECUTE IMMEDIATE n'est pas considérée comme une bonne approche de programmation.
    Cordialement,
    Dariyoosh

  10. #10
    Membre éclairé Avatar de Filippo
    Homme Profil pro
    Statisticien
    Inscrit en
    Mai 2004
    Messages
    864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Statisticien

    Informations forums :
    Inscription : Mai 2004
    Messages : 864
    Points : 881
    Points
    881
    Par défaut
    J'ai complété la procédure avec d'autres actions.

    Je dois automatiser des requêtes pour que des personnes qui n'y connaissent presque rien en sql les utilisent sous toad sans toucher au code.

    Je ne suis pas informaticien. Je suis conscient que mon code n'est pas optimal.
    Je tiens néanmoins compte de vos remarques.
    Merci pour vos conseils.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

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

Discussions similaires

  1. Utiliser une variable char dans une condition
    Par cedriclv dans le forum C
    Réponses: 6
    Dernier message: 11/06/2014, 18h38
  2. Modif d'une variable char* dans une fonction
    Par kase74 dans le forum Débuter
    Réponses: 4
    Dernier message: 22/01/2009, 08h31
  3. Réponses: 4
    Dernier message: 11/10/2007, 08h51
  4. Réponses: 1
    Dernier message: 14/02/2007, 17h08
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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