2012-03-06 55 views
2

我想在PL/SQL中創建一個表格在PL/SQL中創建表?

我該如何實現這一目標?

的愈來愈

錯誤報告:

ORA-00933: 「SQL命令不能正確地結束」

這裏是我的錯誤與

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; 
代碼
+0

爲什麼'EXECUTE IMMEDIATE'?只需創建表格。 – vulkanino 2012-03-06 15:48:32

+3

@vulkanino:因爲你不能在EXECUTE IMMEDIATE下執行PL/SQL內部的DDL語句。 – Benoit 2012-03-06 15:49:01

+1

@Benoit - 這就是問題所在。爲什麼PL/SQL?爲什麼不創建表格?在有些情況下,這種做法是合法的,但這種做法被誤導或明顯錯誤的情況下,它們的數量遠遠超過了這一數字。 – APC 2012-03-07 12:25:57

回答

7

你應該這樣做,你excecute立竿見影內炭最新轉換的PLSQL串。

您聲明的日期將被「back-cast」連接到一個varchar2,並且再次爲執行create table語句「重新轉換」爲一個日期。在這兩個演員陣容中可能會發生「各種各樣的事情」,因此您希望確保在控制日期時如何解釋字符串。

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 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 ???如果是這樣,那麼我得到這個錯誤ORA-00936:「缺少表達式」 – 2012-03-06 16:00:19

+0

是的,綁定。來自查詢的這個值:station_id_ms1將自然替換爲在USING IN station_id_ms1中寫入的值。 – 2012-03-06 16:02:09

+0

我得到這個ORA-01027:「綁定變量不允許用於數據定義操作」 – 2012-03-06 16:07:10