2012-03-06 2 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 문의 실행을 위해 날짜로 다시 "다시 캐스트"됩니다. 그리고 "모든 종류의 일들"이이 두 가지 형식에서 발생할 수 있으므로 날짜로 변환 할 때 문자열이 어떻게 해석되는지 당신이 통제하고 있는지 확인하기를 원합니다.

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

예, 바인드합니다. 이 쿼리의 값 : station_id_ms1은 USING IN station_id_ms1에 기록 된 값으로 자연스럽게 바뀝니다. –

+0

ORA-01027 : "데이터 정의 연산에 바인드 변수가 허용되지 않았습니다." –