-5

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

第 11 行的错误:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:

开始案例声明结束异常退出 goto if loop mod null pragma raise return select update while with close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe

我正在使用的代码:

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 
4

1 回答 1

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;

taxiCar假设和表之间存在某种关系driver,我会假设您也缺少连接条件(例如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;
于 2012-05-04T17:28:10.577 回答