卡在 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】:

FROMINTO 之后,THENIF 之后是必需的,那么当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 结束

编译过程时 PL/SQL 工具包 Web 应用程序错误

ORA-00933: SQL 命令未正确结束 00933. 00000 - “SQL 命令未正确结束

SQL 错误:ORA-00933:SQL 命令未正确结束 00933。00000 -“SQL 命令未正确结束”

“ORA-00933: SQL 命令未正确结束”

SQL 命令未正确结束 oracle 10g 功能