2

このトリガーを作成しようとすると、次のコンパイラ エラーが発生します。

create or replace
TRIGGER RESTAR_PLAZAS
AFTER INSERT ON PLAN_VUELO
BEGIN
SELECT F.NRO_VUELO, M.CAPACIDAD, M.CAPACIDAD - COALESCE((
SELECT count(*) FROM PLAN_VUELO P
WHERE P.NRO_VUELO = F.NRO_VUELO
       ), 0) as PLAZAS_DISPONIBLES
FROM VUELO F
      INNER JOIN MODELO M ON M.ID = F.CODIGO_AVION; 
END RESTAR_PLAZAS;


Error(2,7): PL/SQL: SQL Statement ignored
Error(8,5): PL/SQL: ORA-00933: SQL command not properly ended
Error(8,27): PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:     begin case declare end exception exit for goto if loop mod    null pragma raise return select update while with    <an identifier> <a double-quoted delimited-identifier>    <a bind variable> << close current delete fetch lock insert    open rollback savepoint set sql execute commit forall merge    pipe 
Error(2,1): PLS-00428: an INTO clause is expected in this SELECT statement

このトリガーの何が問題になっていますか?

4

3 に答える 3

2

許可されません

SELECT count(*) FROM PLAN_VUELO

PLAN_VUELO のトリガーで

トリガーを使用しないでください。ストアド プロシージャを使用します。

于 2011-01-17T08:48:39.243 に答える
1

PL/SQL ブロック内では、何かをしなければなりませんSELECT ... INTO。昨日のあなたの質問への回答に、この例がありました。この場合、ローカル変数を選択し、その結果を使用して別のテーブルを更新することができます。

しかし、関心のある値に制限していないため、おそらく多くの結果が返されるようです。句は、WHERE挿入された行の:NEW値のいずれにもフィルターをかけません。これにより、ORA-02112 が発生します。select が正確に 1 つの行を返すことを確認するか、実際に複数の行が必要な場合はカーソルを確認する必要があります。

于 2011-01-17T07:49:04.053 に答える
1

結果の型に応じて into 句を追加するだけです。一例:

declare
  my_result VUELO%rowtype;
begin
  select v.* into my_result from VUELO v where id = '1';
end;
于 2012-09-24T18:21:36.120 に答える