将存储过程添加到Oracle时出现文件结束错误

时间:2012-05-04 17:21:33

标签: sql oracle

我正在编写存储过程并遇到以下错误:

  

第11行的错误:PLS-00103:遇到符号“文件结束”时   期待以下之一:

     

如果循环模式为null,则为goto开始大小写声明结束异常退出   pragma raise返回选择更新,同时关闭当前删除   fetch lock insert open rollback savepoint set sql execute commit   forall合并管道

我正在使用的代码:

create or replace PROCEDURE search_car244ikYKOETEO
IS
long TAXICAR.LONGITUDE%type;
lat TAXICAR.LATITUDE%type;
BEGIN

select LONGITUDE,LATITUDE
into long,lat
from taxiCar,driver
where driver.STATEOFDRIVER='free' and taxiCar.name='taxiRiyadh'
END;

一旦我在最后纠正了丢失的分号,我得到了一个不同的错误

ERROR at line 8: PL/SQL: ORA-00936: missing expression 

1 个答案:

答案 0 :(得分:2)

您的SELECT语句最后缺少分号。 LONG也是保留字,因此您需要选择其他变量名称。我强烈建议为局部变量采用标准前缀,以区别于列名。

create or replace PROCEDURE search_car244ikYKOETEO
IS
  l_long TAXICAR.LONGITUDE%type; -- <-- LONG is a reserved word
  l_lat  TAXICAR.LATITUDE%type;
BEGIN
  select LONGITUDE,
         LATITUDE
    into l_long,
         l_lat
    from taxiCar,driver
   where driver.STATEOFDRIVER='free' 
     and taxiCar.name='taxiRiyadh'; -- <-- A semicolon terminates a SQL statement
END;

假设taxiCardriver表之间存在某种关系,我会假设您也缺少一个连接条件(如果有外键,则为and taxiCar.carID = driver.carID}引用driver的主键的taxiCar

编译过程后,如果SELECT语句返回1行以外的任何内容,则会抛出错误。似乎有可能有0个免费驱动程序或超过1个免费驱动程序,所以你似乎不太可能想要SELECT ... INTO。也许您想使用游标迭代行。也许您希望将BULK COLLECT数据放入集合中。也许你想创建一个视图而不是存储过程。

如果您想使用光标迭代行并打印出经度

create or replace PROCEDURE search_car244ikYKOETEO
IS
BEGIN
  FOR x IN (select LONGITUDE,
                   LATITUDE
              from taxiCar,
                   driver
             where driver.STATEOFDRIVER='free' 
               and taxiCar.name='taxiRiyadh')
  LOOP
    dbms_output.put_line( x.longitude );
  END LOOP;
END;