-5

ストアド プロシージャを作成していて、次のエラーが発生しました。

11 行目のエラー: PLS-00103: 次のいずれかを予期しているときに、シンボル「ファイルの終わり」が発生しました:

begin case 宣言 end 例外 exit for 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する外部キーがある場合など)。drivertaxiCar

SELECTプロシージャがコンパイルされると、ステートメントが 1 行以外を返す場合、エラーがスローされます。無料のドライバーが 0 つまたは複数の無料のドライバーが存在する可能性が高いようです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 に答える