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 :

EXECUTE IMMEDIATE : erreur "missing coma"


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Par défaut EXECUTE IMMEDIATE : erreur "missing coma"
    Bien le Bonsoir à tous,

    j'exécute une procédure stockée contenant un curseur.
    L'objectif pour moi est de faire un INSERT dans une table partitionnée.
    J'ai donc paramétré ma procédure de sorte à pouvoir definir le mois et l'année de la partition, j'utilise pour cela EXECUTE IMMEDIATE mais j'ai le message d'erreur suivant:
    ORA-00917: missing comma
    ORA-06512: at "DEBLOCAGE_NUX_PARAMETRE", line 39
    ORA-06512: at line 1
    Ci-dessous le bout de code:

    CREATE OR REPLACE PROCEDURE DEBLOCAGE_NUX_PARAMETRE (Mois_partition varchar2,An_partition varchar2) is
    ....

    begin

    open CUR_COMMAND_STRING;
    loop
    fetch CUR_COMMAND_STRING into VAR_CUR_COMMAND_STRING;

    exit when CUR_COMMAND_STRING%NOTFOUND;

    select (BSA_TRN_SEQ.NEXTVAL) into SEQ from dual;
    CMD:='TRANID='||SEQ||',DESTNO=3,DESTYP=IN,EVTCODE=UNLOCK,MSISDN='||VAR_CUR_COMMAND_STRING.CDEC||',';

    part_str:='insert into BIL.BSA_TRANSACTIONS PARTITION(BSA_TRANS_'||Mois_partition||'_'||An_partition||')
    (TRANSACTION_ID,REPLY_DATE,STATUS,COMMAND_STRING,PRIORITY,CREATE_DATE,EVENT_CODE)

    values ('||SEQ||',sysdate,1,'||CMD||',1,sysdate,UNLOCK)';

    execute immediate part_str;
    MErci d'avance pour votre précieuse aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    ta variable cmd fini par une virgule.
    Quand tu la concatènes tu lui rajoutes encore une virgule après.

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Par défaut
    oui en effet, l'ennui c'est que cette virgule est imperative dans CMD.Y'aurait-il moyen de forcer la virgule comme etant un string?

  4. #4
    Invité
    Invité(e)
    Par défaut
    ok, je comprends ce que vous voulez faire...

    Mettez des doubles quotes pour ajouter des simples quotes en début et fin de votre variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CMD:='''TRANID='||SEQ||',DESTNO=3,DESTYP=IN,EVTCODE=UNLOCK,MSISDN='||VAR_CUR_COMMAND_STRING.CDEC||',''';

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Bonjour

    Pour moi, il n'y a aucun besoin de faire du SQL dynamique pour un INSERT dans une table partitionnée.
    Les données aboutissent automatiquement dans la partition adaptée, selon la valeur de la clé de partitionnement.
    Donc un INSERT ordinaire est tout à fait suffisant.

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Par défaut
    Merci Jerome_Mtl

    Voici le nouveau bout de code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    open CUR_COMMAND_STRING;
           loop 
                fetch CUR_COMMAND_STRING into VAR_CUR_COMMAND_STRING;
                exit when CUR_COMMAND_STRING%NOTFOUND;
                select (BSA_TRN_SEQ.NEXTVAL) into SEQ from dual;
                select user into VAR_USER from dual;
     
                CMD:='''TRANID='||SEQ||',DESTNO=3,DESTYP=IN,EVTCODE=UNLOCK,MSISDN='||VAR_CUR_COMMAND_STRING.CDEC||',''';
     
                part_str:='insert into BIL.BSA_TRANSACTIONS PARTITION(BSA_TRANS_'||Mois_partition||'_'||An_partition||')(TRANSACTION_ID,REPLY_DATE,STATUS,COMMAND_STRING,PRIORITY,CREATE_DATE,EVENT_CODE)values ('||SEQ||',sysdate,1,'||CMD||',1,sysdate,UNLOCK)';
     
           execute immediate part_str;


    j'ai cette fois le message d'erreur suivant:

    ORA-00984: column not allowed here
    ORA-06512: at "JDIMI.DEBLOCAGE_NUX_PARAMETRE", line 40
    ORA-06512: at line 1

  7. #7
    Invité
    Invité(e)
    Par défaut
    est-ce que vous avez pris la peine de faire un dbms_output pour tester la validité du code que vous envoyez à l'execute immediate ?
    Ça serait un test minimal à faire...
    Après on ne sait pas la structure de votre table BIL.BSA_TRANSACTIONS... Je veux bien vous aidez mais il m'est difficile de résoudre un problème de colonnes quand je ne les connais pas...

    Après il reste la question fondamentale soulevée par Pomalaix, pourquoi faire du sql dynamique dans votre cas...

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/09/2014, 11h00
  2. [11g] Erreur "missing right quote" mystère
    Par tiritchi dans le forum PL/SQL
    Réponses: 7
    Dernier message: 22/07/2013, 22h22
  3. Réponses: 5
    Dernier message: 07/08/2007, 12h20
  4. [PLSQL] Erreur 00922 sur Execute immediate
    Par Henrisbg dans le forum Oracle
    Réponses: 5
    Dernier message: 17/11/2005, 16h06

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