-2

私は、テーブルに行を挿入し、後で同じ外部キーを持つ他のすべてを更新する必要がある簡単な手順を書いています。私の問題は、他のTHENステートメントです。 SQL Developerは、私は、このエラーを与えている次のようにPL/SQLその他の場合エラー

Error(26,3): PLS-00103: Encountered the symbol "WHEN" 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 << continue close current delete fetch lock insert open rollback savepoint set sql execute commit forall merge pipe purge The symbol "exception" was substituted for "WHEN" to continue.

私の手順は次のとおりです。

CREATE OR REPLACE PROCEDURE INS_RETUR 
(
    P_BRDOKUMENTA IN RETUR.BrDokumenta%TYPE, 
    P_DATKREIRANJA IN RETUR.DatKreiranja%TYPE, 
    P_DATSTAMPANJA IN RETUR.DatStampanja%TYPE, 
    P_SIFRJ IN RETUR.SifRJ%TYPE, 
    P_BRRADKNJIZ IN RETUR.BrRadKnjiz%TYPE, 
    P_PRIJEMNIBR IN RETUR.PrijemniBr%TYPE, 
    P_BRPORUDZBENICE IN RETUR.BrPorudzbenice%TYPE, 

    P_REZULTAT OUT NUMBER 
) 
AS 
BEGIN 
    P_REZULTAT := 0; 
    P_PORUKA := 'Ok'; 

    INSERT INTO Retur 
    VALUES (P_BRDOKUMENTA, P_DATKREIRANJA, P_DATSTAMPANJA, P_SIFRJ, P_BRRADKNJIZ, P_PRIJEMNIBR, P_BRPORUDZBENICE, 'A'); 

    UPDATE Retur 
    SET Status = 'N' 
    WHERE BrPorudzbenice = P_BRPORUDZBENICE 
    AND BrDokumenta != P_BRDOKUMENTA; 

    WHEN OTHERS THEN 
    P_REZULTAT := 1; 
    P_PORUKA := (-10001,'Doslo je do greske - '||SQLCODE||' -GRESKA- '||SQLERRM); 
END INS_RETUR; 

ですが、なぜでしょうか?

また、このエラーをロールバックするためにRAISEする必要がありますか?これは、コードがWHEN OTHERS THENステートメントに達すると自動的に行われますか?前もって感謝します。

答えて

3

あなたが不足しているEXCEPTION

BEGIN 
... 
EXCEPTION 
    WHEN OTHERS THEN 
    P_REZULTAT := 1; 
    ... 
END; 

エラーメッセージが、この場合に有用である:

Error(26,3): PLS-00103: Encountered the symbol "WHEN" when expecting one of the following: (begin case declare end exception exit for goto if loop ...

+0

あなたは絶対に正しいです!そして私は...学習しています:)ありがとう! – dzenesiz

+0

あなたは大歓迎です! – Aleksej

1

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::p11_question_id:1155066278457

http://stevenfeuersteinonplsql.blogspot.com/2017/02/now-not-to-handle-exceptions.html

あなたはWHEN OTHERSを使用して賭けるべきではありませんこの場合はまったく - at少なくとも明白な目的のためではない。

これは長年にわたり遭遇したと思われるウイルスの行動です。

pl/sqlで発生するデータに関連しないエラーが多すぎるため、プログラムがクラッシュして参照整合性が損なわれることがあります。

CREATE OR REPLACE PROCEDURE INS_RETUR 
(
    P_BRDOKUMENTA IN RETUR.BrDokumenta%TYPE, 
    P_DATKREIRANJA IN RETUR.DatKreiranja%TYPE, 
    P_DATSTAMPANJA IN RETUR.DatStampanja%TYPE, 
    P_SIFRJ IN RETUR.SifRJ%TYPE, 
    P_BRRADKNJIZ IN RETUR.BrRadKnjiz%TYPE, 
    P_PRIJEMNIBR IN RETUR.PrijemniBr%TYPE, 
    P_BRPORUDZBENICE IN RETUR.BrPorudzbenice%TYPE, 

    P_REZULTAT OUT NUMBER 
) 
AS 
BEGIN 
    P_REZULTAT := 0; 
    P_PORUKA := 'Ok'; 

    INSERT INTO Retur 
    VALUES (P_BRDOKUMENTA, P_DATKREIRANJA, P_DATSTAMPANJA, P_SIFRJ, P_BRRADKNJIZ, P_PRIJEMNIBR, P_BRPORUDZBENICE, 'A'); 

    IF SQL%ROWCOUNT <= 0 THEN 
    [DO SOMETHING, MAYBE SOME MESSAGING, MAYBE SKIP THE UPDATE?] 
    END IF; 

    UPDATE Retur 
    SET Status = 'N' 
    WHERE BrPorudzbenice = P_BRPORUDZBENICE 
    AND BrDokumenta != P_BRDOKUMENTA; 

    IF SQL%ROWCOUNT <= 0 THEN 
    [DO SOMETHING, MAYBE SOME MESSAGING] 
    END IF; 

EXCEPTION 
    WHEN OTHERS THEN 
    P_REZULTAT := 1; 
    P_PORUKA := (-10001,'Doslo je do greske - '||SQLCODE||' -GRESKA- '||SQLERRM); 
    DBMS_OUTPUT.PUT_LINE(FORMAT_ERROR_STACK); 
    DBMS_OUTPUT.PUT_LINE(FORMAT_ERROR_BACKTRACE); 
    RAISE; 
END INS_RETUR; 
関連する問題