使用COUNT(*)时如何获取NO_DATA_FOUND异常以输出?

时间:2019-02-07 02:51:13

标签: sql oracle exception plsql

我试图确定为什么我的异常输出未正确返回。

这是针对使用PL / SQL进行练习的Oracle SQL Developer。如果需要,我可以提供表格代码。

SET serveroutput on

CREATE OR REPLACE Procedure GetPermissions(user IN VARCHAR, docNum OUT 
INTEGER)
IS
BEGIN
SELECT count(*) INTO docNum FROM UserPermissions where UserName=user;

EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Nothing found for this username');
END;
/

DECLARE
doc_count INTEGER;
BEGIN
 doc_count:=0;
 GetPermissions('Steve', doc_count);
 dbms_output.put_line(' Number of documents: ' || doc_count);
END;
/

我期望在运行“史蒂夫”时异常返回其输出(未找到任何内容),因为这不是我创建的表中的用户名。当前运行时仅显示“文档数:0”。

2 个答案:

答案 0 :(得分:5)

COUNT始终返回结果,在这种情况下,它将返回其中包含0的单行:

COUNT(*)
--------
0

NO_DATA_FOUND仅在SELECT INTO查询不返回任何行时发生。

例如,如果您尝试选择给定用户的权限,将抛出NO_DATA_FOUND

SELECT permission 
INTO p_permission
FROM UserPermissions 
WHERE UserName=user;

在这种情况下,查询将返回空结果。

答案 1 :(得分:0)

当查询的输出为无行时,

select into查询返回No_Data_found异常。不是0时。

select into子句的另一个异常是行太多,查询返回的行多于1行,而您试图将所有这些都分配给变量。