【发布时间】:2019-01-05 11:21:53
【问题描述】:
我正在使用这个存储过程,我在其中检查游标是否包含任何数据,如果它有 0 条记录,则引发异常,否则将数据返回到输出中。
CREATE OR replace PROCEDURE user_details(v_ownerid IN NUMBER,
v_branchcode IN NVARCHAR2,
v_login IN NVARCHAR2,
cv_1 OUT SYS_REFCURSOR)
IS
result_out1 SYS_REFCURSOR;
v_territoryid NUMBER(10);
v_user NUMBER(10);
CURSOR cc IS
SELECT Z.username AS USERNAME,
Z.loginid AS LOGINID,
Z.userid AS CRMUSERID
FROM userterritory U
inner join teammembers T
ON U.ownerid = T.ownerid
AND U.userid = T.memberid
inner join az_user Z
ON Z.appownerid = T.ownerid
AND Z.userid = T.memberid;
TYPE tbl_join
IS TABLE OF cc%ROWTYPE;
l_table TBL_JOIN;
BEGIN
SELECT regionid
INTO v_territoryid
FROM regions
WHERE ownerid = v_ownerid
AND categorytype = 3
AND code = v_branchcode;
SELECT userid
INTO v_user
FROM az_user
WHERE appownerid = v_ownerid
AND loginid = v_login;
OPEN result_out1 FOR
SELECT Z.username AS USERNAME,
Z.loginid AS LOGINID,
Z.userid AS CRMUSERID
FROM userterritory U
inner join teammembers T
ON U.ownerid = T.ownerid
AND U.userid = T.memberid
inner join az_user Z
ON Z.appownerid = T.ownerid
AND Z.userid = T.memberid
WHERE Z.appownerid = v_ownerid
AND T.reportsto = v_user
AND U.territoryid = v_territoryid; --using whereClause;
FETCH result_out1 bulk collect INTO l_table;
-- FETCH result_out1 bulk collect INTO l_table;
dbms_output.Put_line('Count '
|| l_table.count);
IF l_table.count > 0 THEN
OPEN cv_1 FOR
SELECT Z.username AS USERNAME,
Z.loginid AS LOGINID,
Z.userid AS CRMUSERID
FROM userterritory U
inner join teammembers T
ON U.ownerid = T.ownerid
AND U.userid = T.memberid
inner join az_user Z
ON Z.appownerid = T.ownerid
AND Z.userid = T.memberid
WHERE Z.appownerid = v_ownerid
AND T.reportsto = v_user
AND U.territoryid = v_territoryid;
ELSE
Raise_application_error(-20001, 'Data Not Found.');
END IF;
END;
如果数据不存在,此存储过程将引发异常。但不是返回自定义异常消息,而是返回系统异常:
ORA-01403:未找到数据
我在这里做错了吗?是否需要进行任何更改才能返回自定义异常消息,即“未找到数据”?我将修改此消息。早些时候我在 SP 下使用,但在记录为 0 的情况下它没有返回任何错误消息,因为我已经完成了存储过程中提到的更改:
CREATE OR replace PROCEDURE user_details(v_ownerid IN NUMBER,
v_branchcode IN NVARCHAR2,
v_login IN NVARCHAR2,
cv_1 OUT SYS_REFCURSOR)
AS
v_territoryid NUMBER(10);
v_user NUMBER(10);
BEGIN
SELECT regionid
INTO v_territoryid
FROM regions
WHERE ownerid = v_ownerid
AND categorytype = 3
AND code = v_branchcode;
SELECT userid
INTO v_user
FROM az_user
WHERE appownerid = v_ownerid
AND loginid = v_login;
OPEN cv_1 FOR
SELECT Z.username AS USERNAME,
Z.loginid AS LOGINID,
Z.userid AS CRMUSERID
FROM userterritory U
inner join teammembers T
ON U.ownerid = T.ownerid
AND U.userid = T.memberid
inner join az_user Z
ON Z.appownerid = T.ownerid
AND Z.userid = T.memberid
WHERE Z.appownerid = v_ownerid
AND T.reportsto = v_user
AND U.territoryid = v_territoryid;
END;
【问题讨论】:
-
我怀疑其中一个 pure 选择(
select userid或select regionid)返回 ORA-01403,而不是光标。 -
错误可能来自
SELECT regionid INTO v_territoryid FROM regions或SELECT userid INTO v_user -
@KaushikNayak 和 Littlefoot 谢谢。我错过了检查那部分是我的错误。是的,该行发生了异常。我已经评论了那部分以供检查。它正在返回预期的错误消息。