我的商店程序如下:
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,但是我想知道是否可以在程序中以某种方式完成此操作。
答案 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;