2017-10-25 12 views
0

Oracle Database 12c Enterprise Editionリリース12.1.0.2.0 - 64bit Productionでプロシージャをプログラミングしています。ストアド・プロシージャに「EXCEPTION」というエラーが発生しました

例外がスローされた場合にループを終了させたくないため、ループ内で例外が発生しました。

create or replace procedure PARSE_REGISTER_MESSAGE 
    IS 

     HOTELS_TO_PROCESS number := 5000;  

     cursor unparsed_messages is 

     SELECT REGISTER_psd_id, message 

     FROM 
      (SELECT REGISTER_psd_id, message 
       FROM cc_owner.REGISTER_psd 
       WHERE parsed != 1 
        OR parsed IS NULL 
       ORDER BY CREATION_DATE DESC) 

     WHERE rownum < HOTELS_TO_PROCESS; 

    BEGIN 

    FOR psd_rec in unparsed_messages 
    LOOP 

p_msg.parse_msg (psd_rec.REGISTER_psd_id, null, psd_rec.message); 

     EXCEPTION 

     WHEN OTHERS 
     THEN 
     DECLARE 
      l_code INTEGER := SQLCODE; 
     BEGIN 

      of_owner.p_db_trc.add_error 
       ('PARSE_REGISTER_MESSAGE','', 
        l_code, 
        sys.DBMS_UTILITY.format_error_stack, 
        sys.DBMS_UTILITY.format_error_backtrace, 
        sys.DBMS_UTILITY.format_call_stack); 

     END; 

    END LOOP; 

END; 

しかし、私はこのエラーが原因でパッケージをコンパイルすることはできません。

Error(25,10): PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:
(begin case declare end 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

私も試してみました:

create or replace procedure PARSE_REGISTER_MESSAGE 
    IS 

     HOTELS_TO_PROCESS number := 5000;  

     cursor unparsed_messages is 

     SELECT REGISTER_psd_id, message 

     FROM 
      (SELECT REGISTER_psd_id, message 
       FROM cc_owner.REGISTER_psd 
       WHERE parsed != 1 
        OR parsed IS NULL 
       ORDER BY CREATION_DATE DESC) 

     WHERE rownum < HOTELS_TO_PROCESS; 

     psd_rec unparsed_messages%ROWTYPE; 

    BEGIN 

    FOR psd_rec in unparsed_messages 
    LOOP 
     BEGIN 

      p_msg.parse_msg (psd_rec.REGISTER_psd_id, null, psd_rec.message); 

     EXCEPTION 

     WHEN OTHERS 
     THEN 
     DECLARE 
      l_code INTEGER := SQLCODE; 
     BEGIN 

      of_owner.p_db_trc.add_error 
       ('PARSE_REGISTER_MESSAGE','', 
        l_code, 
        sys.DBMS_UTILITY.format_error_stack, 
        sys.DBMS_UTILITY.format_error_backtrace, 
        sys.DBMS_UTILITY.format_call_stack); 

     END; 

    END LOOP; 

END; 

しかし、その後、私はこのエラーを得た:

Error(48,4): PLS-00103: Encountered the symbol ";" when expecting one of the following:  loop 

答えて

0

PLSQLblock/procedureの構文は次のとおりです。あなたが上記の使用している場合にのみ動作します私はあなたのコードを見たときに今、あなたはFOR LOOPExceptionブロックを書かれている

DECLARE 
-- Here you declare all the varaible used in block 
BEGIN 
-- Here you write the body of the Block 
EXCEPTION 
-- Here you write the exceptions which you want to handle. 
END; 

、構文。あなたの場合、ExceptionブロックのスコープはOracleで識別されないため、エラーが発生します。

FOR psd_rec IN unparsed_messages 
    LOOP 
     p_msg.parse_msg (psd_rec.REGISTER_psd_id, NULL, psd_rec.MESSAGE);   

     EXCEPTION --<-- Wrong way of using Excepton block. Scope of this Exception block is not resolved 
     WHEN OTHERS 
     THEN 
     DECLARE 
      l_code INTEGER := SQLCODE; 
     BEGIN 
      of_owner.p_db_trc.add_error 
       ('PARSE_REGISTER_MESSAGE','', 
        l_code, 
        sys.DBMS_UTILITY.format_error_stack, 
        sys.DBMS_UTILITY.format_error_backtrace, 
        sys.DBMS_UTILITY.format_call_stack); 

     END; 

Exceptionブロックをforループに含めるには、コードを次のように変更する必要があります。

CREATE OR REPLACE PROCEDURE PARSE_REGISTER_MESSAGE 
    IS 
     HOTELS_TO_PROCESS NUMBER := 5000; 
     l_code    INTEGER := SQLCODE; 

     CURSOR unparsed_messages 
     IS 
      SELECT REGISTER_psd_id, MESSAGE 
      FROM ( SELECT REGISTER_psd_id, MESSAGE 
         FROM cc_owner.REGISTER_psd 
        WHERE parsed != 1 OR parsed IS NULL 
        ORDER BY CREATION_DATE DESC) 
      WHERE ROWNUM < HOTELS_TO_PROCESS; 
    BEGIN 
     FOR psd_rec IN unparsed_messages 
     LOOP 
      BEGIN 
      p_msg.parse_msg (psd_rec.REGISTER_psd_id, NULL, psd_rec.MESSAGE); 
      EXCEPTION 
      WHEN OTHERS 
      THEN 
       of_owner.p_db_trc.add_error (
        'PARSE_REGISTER_MESSAGE', 
        '', 
        l_code, 
        sys.DBMS_UTILITY.format_error_stack, 
        sys.DBMS_UTILITY.format_error_backtrace, 
        sys.DBMS_UTILITY.format_call_stack); 
      END; 
     END LOOP; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (SQLERRM);  
END; 

あなたは2回目の試行はENDの文が欠落してあなたがエラーになった理由のthatsました。下記を参照:

CREATE OR REPLACE PROCEDURE PARSE_REGISTER_MESSAGE 
IS 
    HOTELS_TO_PROCESS NUMBER := 5000; 
    l_code    INTEGER := SQLCODE; 

    CURSOR unparsed_messages 
    IS 
     SELECT REGISTER_psd_id, MESSAGE 
     FROM ( SELECT REGISTER_psd_id, MESSAGE 
        FROM cc_owner.REGISTER_psd 
       WHERE parsed != 1 OR parsed IS NULL 
       ORDER BY CREATION_DATE DESC) 
     WHERE ROWNUM < HOTELS_TO_PROCESS; 

    psd_rec    unparsed_messages%ROWTYPE; 
BEGIN 
    FOR psd_rec IN unparsed_messages 
    LOOP 
     BEGIN 
     p_msg.parse_msg (psd_rec.REGISTER_psd_id, NULL, psd_rec.MESSAGE); 
     EXCEPTION 
     WHEN OTHERS 
     THEN 
      BEGIN 
       of_owner.p_db_trc.add_error (
        'PARSE_REGISTER_MESSAGE', 
        '', 
        l_code, 
        sys.DBMS_UTILITY.format_error_stack, 
        sys.DBMS_UTILITY.format_error_backtrace, 
        sys.DBMS_UTILITY.format_call_stack); 
      END; 
     END; 
    END LOOP; 
END; 
1

Begin after loopキーワードをBEGINとして使用してみてくださいunparsed_messagesにpsd_rec FOR

を逃す LOOP は p_msg.parse_msg(psd_rec.REGISTER_psd_id、ヌル、psd_rec.message)をBEGIN;

 EXCEPTION 

    WHEN OTHERS 
    THEN 
    DECLARE 
     l_code INTEGER := SQLCODE; 
    BEGIN 

     of_owner.p_db_trc.add_error 
      ('PARSE_REGISTER_MESSAGE','', 
       l_code, 
       sys.DBMS_UTILITY.format_error_stack, 
       sys.DBMS_UTILITY.format_error_backtrace, 
       sys.DBMS_UTILITY.format_call_stack); 

    END; 
関連する問題