2017-08-22 19 views
0

誰もがこのエラーで私を助けることができますか?私は毎日/月に変更されるテーブル名を連結するCreate Tableステートメントを即時実行したかったのです。即時即時作成テーブル

これは私のコードです...

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; 

これは私がこれに関する多くのコードを検索した私が取得しています...

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 

エラーです。 ..しかし、私は誰もテーブルを作成している間、変数としてテーブル名を連結していない。

これが可能かどうかを知りたいだけです。そして、私はこれがうまくいくように提案しています。ありがとうございました!

+0

正確なコードで質問を更新することができます –

+1

引用符を確認してください。例えば。 'EXECUTE IMMEDIATE '''は 'EXECUTE IMMEDIATE 'でなければなりません。また、サブクエリ(v_get_fromdate)で ';'を使用することはできません – daZza

+0

これは正確なコードです。データ保護の値を変更するだけです。ありがとうございます – Luis

答えて

1

ライン - あなたは1つのだけ引用していない2重引用符

の変更を必要とする

EXECUTE IMMEDIATE '' 

それに

EXECUTE IMMEDIATE ' 

ライン

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;'; 

する必要があります

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)'; 

セミコロンはサブクエリ内で使用できません。

+0

私の謝罪... 1クォートここに2つの引用符を入れてください。しかし、これは誤りではありません。ありがとうございました。 – Luis

+0

ありがとうございます。私はすでにコードを更新しましたが、同じエラーが発生しています。 – Luis

+0

@ルイス -​​ 'v_get_fromdate'で角括弧を追加した後でも? –

0

コードごとに、oracle関数から値をフェッチするためのSELECT文が必要ありません。可能な限り動的クエリーを避ける必要があります。スニペットの下にこれが役立つことを願っています。

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; 
/