2013-05-21 126 views
1

我看不到我的錯誤。我標記了SQL Developer引用錯誤的地方。你能看到我要去哪裏嗎? ZCTA5_2000是一個包含數據的有效表。卡在PL/SQL上:ORA-00933:SQL命令未正確結束

CREATE OR REPLACE TRIGGER zip_trigger 
    BEFORE INSERT ON ZCTA5_2000 
    FOR EACH ROW 
DECLARE 
    low_zip NUMBER(5); 
    high_zip NUMBER(5); <--- Error PL/SQL: SQL Statement ignored ****** 
BEGIN <-----Error PL/SQL: ORA-00933: SQL command not properly ended ******** 

    SELECT LOW_ZIP, HIGH_ZIP FROM ZIPTABLE 
    INTO low_zip, high_zip 
    WHERE :NEW.STATE = STATE_CODE; <--- Error PLS-00103: Encountered the symbol "END"... 
    IF :NEW.ZIP < LOW_ZIP OR :NEW.ZIP>HIGH_ZIP 
    END IF; 
END; 
+0

你一定是在開玩笑!我們不會在您的代碼中搜索語法錯誤。 – Toru

+0

呃,這裏有很多人會。 –

+2

你知道郵政編碼並不是獨一無二的,而且它們也沒有按範圍分配給州,對嗎?而且一些郵政編碼根本不涉及國家。 –

回答

1

看起來行號正在向您報告錯誤。一些前端將做到這一點。

請注意,PLS-00103: Encountered the symbol "END"消息太快三行。假設同爲ORA-00933消息意味着它真的指着SELECT聲明,果然這就是你的錯誤是:

SELECT LOW_ZIP, HIGH_ZIP FROM ZIPTABLE 
INTO low_zip, high_zip <== INTO should be before FROM 
... 

INTO必須的FROMSELECT後。嘗試將其更改爲這樣:

SELECT LOW_ZIP, HIGH_ZIP INTO low_zip, high_zip 
FROM ZIPTABLE 
... 
+0

也是一個非常有用的評論。非常感激。不再把我的頭撞在牆上:) – Dug

1

有可能是不止一個錯誤:

CREATE OR REPLACE TRIGGER zip_trigger 
    BEFORE INSERT ON ZCTA5_2000 
    FOR EACH ROW 
DECLARE 
    low_zip NUMBER(5); 
    high_zip NUMBER(5); 
BEGIN 

    SELECT LOW_ZIP, HIGH_ZIP INTO low_zip, high_zip 
    FROM ZIPTABLE 
    WHERE :NEW.STATE = STATE_CODE; 

    IF :NEW.ZIP < LOW_ZIP OR :NEW.ZIP > HIGH_ZIP THEN 
    NULL; 
    END IF; 
END; 
/

注重排SELECT聲明(SELECT...INTO...FROM而不是SELECT...FROM...INTO)和固定IF聲明(THEN關鍵字和虛擬聲明在IF區塊內)。

+0

是的。在改變select和if後,它會自動編譯錯誤。感謝您的幫助。 – Dug

0

FROM來了INTO後和THEN是強制性之後IF那麼你也應該做一些事情時,IF是真實的。

CREATE OR REPLACE TRIGGER zip_trigger 
    BEFORE INSERT ON ZCTA5_2000 
    FOR EACH ROW 
DECLARE 
    low_zip NUMBER(5); 
    high_zip NUMBER(5); 
BEGIN 
    SELECT LOW_ZIP, HIGH_ZIP 
    INTO low_zip, high_zip 
    FROM ZIPTABLE 
    WHERE :NEW.STATE = STATE_CODE; 
    IF :NEW.ZIP < LOW_ZIP OR :NEW.ZIP > HIGH_ZIP THEN 
     null; 
    END IF; 
END; 
+0

同意並在更改後編譯。謝謝 – Dug

相關問題