2017-08-22 2 views
0

Quelqu'un peut-il m'aider avec cette erreur? Je voulais exécuter une instruction Créer une table immédiate qui concatène un nom de table qui change tous les jours/mois.EXECUTE IMMEDIATE CREATE TABLE

Ceci est mon code ...

DECLARE 
    v_table_name VARCHAR2(100); 
    v_get_fromdate VARCHAR2(200); 
BEGIN 
    v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t'; 
    v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
    ) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;'; 
    EXECUTE IMMEDIATE '' 

    CREATE TABLE ' || v_table_name || ' AS 
    SELECT column1 , 
     column2 , 
     column3 , 
     column4 , 
     column5 
    FROM table_name 
    WHERE column1 >=' || v_get_fromdate ||' 
    AND column3 LIKE ''tbl_%''';  
END; 

c'est l'erreur que je reçois le ...

Error report - 
ORA-00936: missing expression 
ORA-06512: at line 7 
00936. 00000 - "missing expression" 
*Cause:  
*Action: 


Line 7 is EXECUTE IMMEDIATE 'CREATE TABLE ' || v_table_name || ' AS SELECT column1 

J'ai cherché beaucoup de code à ce sujet. .. mais je n'ai vu personne concaténer le nom de la table en tant que variable lors de la création de la table.

Je veux juste savoir si c'est possible. Et je suis ouvert à toute suggestion pour que cela fonctionne. Je vous remercie!

+0

pouvez-vous mettre à jour la question avec votre code exact –

+1

Vérifiez vos devis. Par exemple. «EXECUTE IMMEDIATE» devrait être «EXECUTE IMMEDIATE». Aussi, vous ne pouvez pas utiliser ';' dans une sous-requête (v_get_fromdate) – daZza

+0

c'est le code exact, je change juste les valeurs pour la protection des données. merci – Luis

Répondre

1

Line -

EXECUTE IMMEDIATE '' 

Vous avez seulement besoin 1 devis et non 2 citations

Modifier à

EXECUTE IMMEDIATE ' 

Ligne

v_get_fromdate := 'select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual;'; 

qui devrait être

v_get_fromdate := '(select GET_FROMDATE(to_date(''01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2 
) ||'/2017 00:00:00'',''dd/mm/yyyy hh24:mi:ss''),''R'') from dual)'; 

Les points-virgules ne peuvent pas être utilisés dans une sous-requête.

+0

Mes excuses ... Il devrait être 1 citation mais j'ai Mettez ici 2 citations. Mais ce n'est pas l'erreur. Je vous remercie. – Luis

+0

merci. J'ai déjà mis à jour le code, mais je reçois toujours la même erreur. – Luis

+0

@Luis - même après avoir ajouté les crochets dans 'v_get_fromdate'? –

0

Selon votre code, nous n'avons pas besoin d'instruction SELECT pour récupérer la valeur de la fonction oracle. Nous devrions éviter autant que possible les requêtes dynamiques. J'espère que cet extrait ci-dessous aide.

DECLARE 
    v_table_name VARCHAR2(100); 
    v_get_fromdate VARCHAR2(200); 
BEGIN 
    v_table_name := 'mpiat_after_bs_' || SUBSTR(TO_CHAR(SYSDATE, 'ddmonyy'), 3, 5) || '_t'; 
    V_GET_FROMDATE := GET_FROMDATE(TO_DATE('01/'|| SUBSTR(TO_CHAR(SYSDATE, 'mmddyy'), 1, 2) ||'/2017 00:00:00','dd/mm/yyyy hh24:mi:ss'),'R'); 
    EXECUTE IMMEDIATE '  
     CREATE TABLE ' || v_table_name || ' AS  
     SELECT column1 ,   
     column2 ,   
     column3 ,   
     column4 ,   
     column5  
     FROM table_name  
     WHERE column1 >=' || v_get_fromdate ||'  
     AND column3 LIKE ''tbl_%'''; 
END; 
/