【问题标题】:Oracle stored procedure, catch an error Errno=32152Oracle 存储过程,捕获错误 Errno=32152
【发布时间】:2017-12-15 00:54:19
【问题描述】:

我的存储过程如下:

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;

原则上效果很好,除了一种情况:如果嵌套选择语句“返回零行”调用者返回 "[Errno=32152,OraMsg=ORA-32152: 无法对空数执行操作]"

我猜这是因为 select 语句不返回行 WHERE OUT_DB_ID = null 无效。

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

【问题讨论】:

    标签: oracle stored-procedures


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多