2017-12-14 4 views
0

マイストア手順は以下の通りです:Oracleのストアドプロシージャ、エラーをキャッチERRNO = 32152

create or replace PROCEDURE   "FIND_AND_DOSOMETHING" 
(
IN_PARAM1 IN MYTABLE.PARAM1_ID%TYPE, 
IN_PARAM2 IN MYTABLE.PARAM2_ID%TYPE, 
OUT_PARAM OUT MYTABLE.OUT_DB_ID%TYPE 
) 
AS 
BEGIN 

    UPDATE 
    MYTABLE SET FLAG=1, PARAM1_ID=IN_PARAM1 ,TIMESTAMP = (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM')) 
    WHERE OUT_DB_ID = (SELECT OUT_DB_ID FROM MYTABLE WHERE PARAM2_ID=IN_PARAM2 AND FLAG=0 AND ROWNUM = 1) 
    AND FLAG=0 RETURNING OUT_DB_ID INTO OUT_PARAM; 

    -- COMMIT OUTSIDE 

END FIND_AND_DOSOMETHING; 

は1ケースを除いて、原則的にも作品:ネストされたSELECTステートメントは、発信者が戻って取得する「ゼロ行を返す」場合「[ERRNO = 32152、oramsgの= ORA-32152:NULLの数に操作を実行できません]

私はこれがOUT_DB_ID = nullではないWHERE SELECT文が行を返さないという事実によるものであることを推測します有効です。

1つの方法は、アプリケーションコードで例外32152をキャッチすることですが、何とかこの手順でこれを実行できるかどうかは疑問でした。

答えて

0

これは大きな話題です。単純なGoogle検索では、多くの回答が見つかります。チェックアウトhttps://docs.oracle.com/cd/B19306_01/appdev.102/b14261/errors.htm#i3372

CREATE OR REPLACE PROCEDURE "FIND_AND_DOSOMETHING" (
    in_param1 IN  mytable.param1_id%TYPE 
    , in_param2 IN  mytable.param2_id%TYPE 
    , out_param  OUT mytable.out_db_id%TYPE 
) 
AS 
    cannot_perform_operation EXCEPTION; 
    PRAGMA EXCEPTION_INIT (cannot_perform_operation, -32152); 
BEGIN 
     UPDATE mytable 
      SET flag = 1, param1_id = in_param1, timestamp = (TO_TIMESTAMP (LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM')) 
     WHERE out_db_id = (SELECT out_db_id 
          FROM mytable 
          WHERE param2_id = in_param2 
           AND flag = 0 
           AND ROWNUM = 1) 
      AND flag = 0 
    RETURNING out_db_id 
     INTO out_param; 
EXCEPTION 
    WHEN cannot_perform_operation 
    THEN 
    -- your error processing code goes here 
     NULL; 
END find_and_dosomething; 
関連する問題