2012-03-06 10 views
2

PL/SQL内でテーブルを作成しようとしていますPL/SQLのようにテーブルを作成しますか?

どのように達成できますか?

キープなっ

エラーレポート:

ORA-00933:ここ

は私が

DECLARE 
    station_id_ms1 NUMBER :=10347; 
    realtime_start DATE :=to_date('2012-01-01 00:00:00','YYYY-DD-MM HH24:MI:SS'); 
    realtime_end DATE :=to_date('2012-07-01 00:00:00','YYYY-DD-MM HH24:MI:SS'); 
BEGIN 
    EXECUTE IMMEDIATE (' 
    CREATE TABLE new_table_name 
    AS 
    SELECT 
    ((realtime - to_date(''01-JAN-1970'',''DD-MON-YYYY'')) * (86400)) AS realtime_ms1, 
    magnetic_ms_id, 
    ADC_value_pp_2_mgntc_fld_amp(ch2_value,ch2_gain_value,magnetic_ms_id,2) AS B_x_ms1, 
    ADC_value_pp_2_mgntc_fld_amp(ch1_value,ch1_gain_value,magnetic_ms_id,1) AS B_y_ms1, 
    real_nanosecs2*4/3*360/20e6 AS phase_x_ms1, 
    real_nanosecs1*4/3*360/20e6 AS phase_y_ms1 
    FROM 
     raw_mag 
    WHERE 
    magnetic_ms_id = '||station_id_ms1||' 
    AND realtime  > '||realtime_start||' 
    AND realtime  < '||realtime_end||' 
    AND ch1_tune_value = 0 
    AND realtime  < pkg_timezone.change_timezone(gettime,''CET'',''UTC'') 
    '); 
END; 
でエラーを持っているコードがある "SQLコマンドが正常に終了していません"
+0

なぜ「実行する」?テーブルを作成するだけです。 – vulkanino

+3

@vulkanino:EXECUTE IMMEDIATEを実行せずにPL/SQL内でDDL文を実行できないためです。 – Benoit

+1

@Benoit - ちょうど質問をする。 PL/SQLはなぜですか?なぜテーブルを作成しないのですか?合法的なシナリオがありますが、このアプローチが間違っている、または間違っているケースが非常に多いです。 – APC

答えて

7

あなたはすぐにexcecute チャー最新変換 PLSQL文字列を実行する必要があります。

宣言した日付は、連結のvarchar2に「バックキャスト」され、create table文の実行のために再び日付に「再キャスト」されます。そして、これらの2つのキャストでは「すべてのもの」が発生する可能性があるので、日付にキャストするときに文字列がどのように解釈されるかを制御したいと考えています。

DECLARE 
    station_id_ms1 NUMBER :=10347; 
    realtime_start VARCHAR2(100) :='2012-01-01 00:00:00'; 
    realtime_end VARCHAR2(100) :='2012-07-01 00:00:00'; 
BEGIN 
    EXECUTE IMMEDIATE (' 
    CREATE TABLE new_table_name 
    AS 
    SELECT 
    ((realtime - to_date(''01-JAN-1970'',''DD-MON-YYYY'')) * (86400)) AS realtime_ms1, 
    magnetic_ms_id, 
    ADC_value_pp_2_mgntc_fld_amp(ch2_value,ch2_gain_value,magnetic_ms_id,2) AS B_x_ms1, 
    ADC_value_pp_2_mgntc_fld_amp(ch1_value,ch1_gain_value,magnetic_ms_id,1) AS B_y_ms1, 
    real_nanosecs2*4/3*360/20e6 AS phase_x_ms1, 
    real_nanosecs1*4/3*360/20e6 AS phase_y_ms1 
    FROM 
     raw_mag 
    WHERE 
    magnetic_ms_id = '||station_id_ms1||' 
    AND realtime  > to_date(''' || realtime_start || ''', ''YYYY-DD-MM HH24:MI:SS'') 
    AND realtime  < to_date(''' || realtime_end || ''', ''YYYY-DD-MM HH24:MI:SS'') 
    AND ch1_tune_value = 0 
    AND realtime  < pkg_timezone.change_timezone(gettime,''CET'',''UTC'') 
    '); 
END; 
1

station_id_ms1、realtime_start、realtime_enにはbindsを使用しますD:

EXECUTE IMMEDIATE ' 
... 
WHERE 
magnetic_ms_id = :station_id_ms1 
    AND realtime  > :realtime_start 
    AND realtime  < :realtime_end 
... 
' USING IN station_id_ms1, realtime_start, realtime_end 
+1

は、station_id_ms1、realtime_start、realtime_endでUSINGを意味しますか?もしそうなら、私はこのエラーを受け取ります。ORA-00936: "表現がありません" –

+0

はい、バインドします。 query:station_id_ms1からのこの値は、USING IN station_id_ms1に書き込まれた値と自然に置き換えられます。 –

+0

ORA-01027:「データ定義操作でバインド変数を使用できません」 –

関連する問題