Oracle存储过程,捕获错误Errno = 32152

时间:2017-12-14 12:14:24

标签: oracle stored-procedures

我的商店程序如下:

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;

原则上运作良好,除了一种情况:如果嵌套的select语句"返回零行"调用者返回" [Errno = 32152,OraMsg = ORA-32152:无法对空号码执行操作] "

我想这是因为select语句没有返回行WHERE OUT_DB_ID = null无效。

一种方法是在应用程序代码中捕获异常32152,但是我想知道是否可以在程序中以某种方式完成此操作。

1 个答案:

答案 0 :(得分:0)

这是一个很大的话题,简单的谷歌搜索会找到很多答案。查看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;