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 :

Formatage de chaine pour l'execute immediate


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut Formatage de chaine pour l'execute immediate
    Voilà j'ai une requete de creation de table temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTER||'_'||REPLACE(UPPER(ct.LABEL), ' ', '') as code,  vt.LABEL||'('||ct.LENGTH||')' as type
    from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swift_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt
    where ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TYPE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID
    Bon c'est pas super joli mais ça me donne le résultat attendu !
    Maintenant je voudrais mettre faire cette création au sein d'une procedure PL/SQL. J'utilise donc le bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate('create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTER||_||REPLACE(UPPER(ct.LABEL), '' '', '''') as code, vt.LABEL||''(''||ct.LENGTH||'')'' as type from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swift_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt where ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TYPE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID');
    Ca compile mais à l'exécution j'ai un sushi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-06550: line 4, column 0:
    PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
     
       ; <an identifier> <a double-quoted delimited-identifier>
    The symbol ";" was substituted for "end-of-file" to continue.
    Je pense que c'est du a un problème de cotes ...
    Ça fait 2 h que j'essaye tout et n'importe quoi quelle est la règle d'ajout de cotes ?


    juste pour information la procedure complète
    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
    CREATE OR REPLACE PROCEDURE PROC_GEN_PRSW IS
    TABLE_TO_CREATE  CONSTANT VARCHAR2(10) := 'PRSW2' ;
    tmpVar NUMBER;
    isAlreadyDefined int;
     
    BEGIN
     
       -- loading all attended PRSW fields into a temporary table
     
     
     
       select count(*) into isAlreadyDefined from user_tables where table_name = TABLE_TO_CREATE;
     
       if (isAlreadyDefined = 1)
         then					-- update
       	   tmpVar := 1;
         else					-- insert
    	   -- creating table
     
    	   -- get all fields
    	   tmpVar := 1;
    execute immediate('create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTER||_||REPLACE(UPPER(ct.LABEL), '' '', '''') as code, vt.LABEL||''(''||ct.LENGTH||'')'' as type from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swift_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt where ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TYPE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID');
       end if;
     
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           RAISE;
    END PROC_GEN_PRSW;
    /
    Voilà si quelqu'un a une piste ou une fonction qui pourrait m'aider ... à vot' bon coeur

    Emilien

  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
    ça donne quoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT 'create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTER||_||REPLACE(UPPER(ct.LABEL), '' '', '''') as code, vt.LABEL||''(''||ct.LENGTH||'')'' as type from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swift_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt where ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TYPE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID'
    FROM DUAL;
    Sinon, les exceptions sont inutiles, un COUNT ne fera jamais de no_data_found et un OTHERS fera toujours un RAISE

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Voici le résutat de select from dual :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTE
    R||_||REPLACE(UPPER(ct.LABEL), ' ', '') as code, vt.LABEL||'('||ct.LENGTH||')' a
    s type from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swi
    ft_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt whe
    re ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TY
    PE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID
    Malheureusement ça ne marche pas ...

    Pour ce qui est des exception, c'est TOAD qui ma généré le squelette, j'en suis pas à faire le ménage =)

  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
    Citation Envoyé par Azounet Voir le message
    Malheureusement ça ne marche pas ...
    mais encore ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Citation Envoyé par orafrance Voir le message
    mais encore ?
    Peut être n'ais-je pas bien compris ce le but de ce select.

    Voici ce que j'ai fait :
    - J'ai fait le select from dual, dans SQL plus.
    - copier coller le résultat dans un "execute immediate" au sein de ma procedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate('create table SWIFT_PRSW_FIELDS_TMP as select distinct FIELD_NUMBER||OPTION_LETTER||_||REPLACE(UPPER(ct.LABEL), ' ', '') as code, vt.LABEL||'('||ct.LENGTH||')' as type from SWIFT_OPTION_level ol, SWIFT_OPTION o, SWIFT_MANDATORY_LEVEL ml, swift_type t ,SWIFT_OPTION_CONTENT oc, swift_CONTENT_TYPE ct, SWIFT_VAR_TYPE vt where ol.FK_OPTION = o.OID  and ol.FK_MANDATORY_LEVEL = ml.OID and oc.FK_CONTENT_TYPE = ct.OID and oc.FK_OPTION = o.oid and ct.FK_VAR_TYPE = vt.OID');
    La procedure ne compile plus (normal probleme de cotes)


    erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PLS-00103: Encountered the symbol ", ') as code, vt.LABEL||" when expecting one of the following:
     
       . ( ) , * @ % & | = - + < / > at in is mod not range rem =>

  6. #6
    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
    bah faut doubler les quotes évidemment

  7. #7
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION_LETTER||''_''||REPLACE
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION_LETTER||_||REPLACE
    DAB

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 38
    Par défaut
    Citation Envoyé par DAB.cz Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION_LETTER||''_''||REPLACE
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPTION_LETTER||_||REPLACE
    DAB
    Yes bien joué DAB
    Merci à Orafrance aussi !

    Vive developpez

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

Discussions similaires

  1. script pour d'utiliser la commande execute immediate
    Par menoran dans le forum Oracle
    Réponses: 4
    Dernier message: 04/05/2010, 19h36
  2. Réponses: 0
    Dernier message: 29/04/2010, 13h20
  3. Besoin d'aide pour la fonction execute immediate
    Par kevin8100 dans le forum Oracle
    Réponses: 13
    Dernier message: 25/06/2007, 16h00
  4. Formatage d'une chaine pour sscanf
    Par Pragmateek dans le forum C
    Réponses: 6
    Dernier message: 30/04/2006, 01h11
  5. [Socket] Message different pour 2 execution similaire
    Par Erok dans le forum Entrée/Sortie
    Réponses: 24
    Dernier message: 13/05/2004, 11h49

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