0

select ステートメントを使用してトリガーを作成しました。この select ステートメントが行を返さない場合は、変数「auxiliar」に 0 を入れます。NVL(auxiliar,0) を使用しようとしましたが、機能しません。これどうやってするの?

SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;

[更新]私のトリガーコード:

IF preCondicio THEN
        KMpendents:=coalesce(SELECT rev_pendent_km
            INTO KMpendents
            FROM REV_PENDENT
            WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi,0);
        IF KMtotals+KMpendents>=15000 THEN
            SELECT venedor_codi 
            INTO venedorCodi 
            FROM venedor 
            WHERE venedor_alta=(
                SELECT MAX(venedor_alta) 
                FROM venedor 
                WHERE venedor_delegacio_codi=(
                    SELECT venedor_delegacio_codi
                    FROM venedor
                    WHERE venedor_codi=:NEW.lloguer_venedor_codi));
            INSERT INTO REVISIONS VALUES(:NEW.lloguer_vehicle_codi,:NEW.lloguer_dataf,KMtotals+KMpendents,venedorCodi);
            IF KMpendents!=0 THEN
                DELETE FROM REV_PENDENT 
                WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi;
            END IF;
        ELSE
            IF KMpendents!=0 THEN
                UPDATE REV_PENDENT SET rev_pendent_km=KMtotals+KMpendents WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi;
            ELSE INSERT INTO REV_PENDENT VALUES(:NEW.lloguer_vehicle_codi,KMtotals,:NEW.lloguer_dataf);
            END IF;
        END IF;
    END IF;

変数KMpendentsは、更新前に説明した変数auxiliarと同等です。しかし、オラクルは私にこれらのエラーを示しています:

PLS-00103: 次のいずれかを想定しているときに、記号","が見つかりました: . ( * @ % & - + ; / at for mod 剰余 rem およびまたは交差するグループ 負の順序 start union where connect || indicator multiset

4

2 に答える 2

0

select 句に集計関数のみが含まれている場合は、常に少なくとも 1 つの行が返されます。

SELECT coalesce(sum(salary),0)
INTO   auxiliar
FROM   BILL
WHERE  code=:NEW.code;
于 2012-12-28T11:35:20.893 に答える
0
BEGIN
 SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;
EXCEPTION
  WHEN NOTFOUND THEN
      auxiliar := 0;
END;

またはSQL%NOTFOUND、ステートメントが返されたかどうかを確認するためにも使用できますno rows

CREATE or REPLACE TRIGGER trigger_name
BEFORE INSERT
   ON table_name
   [ FOR EACH ROW ]

DECLARE
   -- variable declarations

BEGIN
    ....
    ....
    BEGIN
     SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;
    EXCEPTION
      WHEN NOTFOUND THEN
          auxiliar := 0;
    END;
    --Yes, this is possible and valid.

EXCEPTION
   WHEN ...
   -- exception handling

END;
于 2012-12-28T00:14:22.970 に答える