卡在 PL/SQL:ORA-00933:SQL 命令未正确结束
Posted
技术标签:
【中文标题】卡在 PL/SQL:ORA-00933:SQL 命令未正确结束【英文标题】:Stuck on PL/SQL: ORA-00933: SQL command not properly ended 【发布时间】:2013-05-21 19:08:25 【问题描述】:我看不到我的错误。我标记了 SQL Developer 引用错误的地方。你能看出我哪里错了吗? ZCTA5_2000 是一个有效的数据表。
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;
【问题讨论】:
你一定是在开玩笑!我们不会在您的代码中搜索语法错误。 呃,这里有很多人愿意。 您知道邮政编码不是各州独有的,它们也不是按范围分配给各州的,对吧?而且有些邮政编码根本与州无关。 【参考方案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
必须在SELECT
之后,在FROM
之前。尝试将其更改为:
SELECT LOW_ZIP, HIGH_ZIP INTO low_zip, high_zip
FROM ZIPTABLE
...
【讨论】:
也是一个非常有用的评论。非常感激。不再把我的头撞在墙上了:)【参考方案2】:可能不止一个错误:
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
块中的虚拟语句)。
【讨论】:
是的。它在更改选择后编译无错误,如果按照指示进行。感谢您的帮助。【参考方案3】: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;
【讨论】:
同意,修改后编译。谢谢以上是关于卡在 PL/SQL:ORA-00933:SQL 命令未正确结束的主要内容,如果未能解决你的问题,请参考以下文章
条件 old 不等于 new 的 Oracle 触发器以错误 PLS-00049、PL/SQL: ORA-00933 结束
ORA-00933: SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束