Oracle 在PL/SQL:ORA-00933上卡住:SQL命令未正确结束

Oracle 在PL/SQL:ORA-00933上卡住:SQL命令未正确结束,oracle,plsql,triggers,plsqldeveloper,Oracle,Plsql,Triggers,Plsqldeveloper,我看不出我的错误。我标记了SQL开发人员引用错误的位置。你能看出我错在哪里吗?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 ****** B

我看不出我的错误。我标记了SQL开发人员引用错误的位置。你能看出我错在哪里吗?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;
创建或替换触发器zip\u触发器
在ZCTA5_2000上插入之前
每行
声明
低邮政编码(5);

高邮政编码(5) 看起来向您报告的行号不正确。一些前端可以做到这一点

请注意,
PLS-00103:遇到的符号“END”
消息太快了三行。假设对
ORA-00933
消息使用相同的方法,则意味着它实际上指向
SELECT
语句,这就是错误所在:

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

可能有不止一个错误:

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;
/
创建或替换触发器zip\u触发器
在ZCTA5_2000上插入之前
每行
声明
低邮政编码(5);
高邮政编码(5);
开始
选择LOW_-ZIP,HIGH_-ZIP进入LOW_-ZIP,HIGH_-ZIP
从ZIPTABLE
其中:NEW.STATE=状态\代码;
如果:NEW.ZIPHIGH\u-ZIP,则
无效的
如果结束;
结束;
/

注意重新排列的
SELECT
语句(
SELECT…INTO…FROM
而不是
SELECT…FROM…INTO
)和固定的
IF
语句(
然后
关键字和
IF
块内的伪语句)

FROM
之后进入
,并且
之后必须有一个
然后
如果
如果
是真的,那么你也应该做些什么

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;
创建或替换触发器zip\u触发器
在ZCTA5_2000上插入之前
每行
声明
低邮政编码(5);
高邮政编码(5);
开始
选择低拉链、高拉链
分为低拉链、高拉链
从ZIPTABLE
其中:NEW.STATE=状态\代码;
如果:NEW.ZIPHIGH\u-ZIP,则
无效的
如果结束;
结束;

你一定是在开玩笑!我们不会在你的代码中搜索语法错误。呃,这里有很多人会这样做。你知道邮政编码不是各州独有的,也不是按范围分配给各州的,对吗?而且有些邮政编码与州根本不相关。是的。如图所示,更改select和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;