我的存储过程存在问题。 它在以下情况下失败
cntmismatch NUMBER;
SELECT COUNT(keyvalue) INTO cntmismatch
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1
如果没有上述标准的数据,则无法
我甚至尝试过使用
SELECT NVL(COUNT(keyvalue),0) INTO cntmismatch
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1
但它仍然在这里返回null并且proc失败
答案 0 :(得分:3)
查询:
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue
...会尝试为每个cntmismatch
将一行返回keyvalue
,如果表为空则会失败,no_data_found
会失败,如果有too_many_rows
则会失败不止一个keyvalue
。
添加:
HAVING count(keyvalue) > 1
...意味着它只会为具有多个条目的任何keyvalue
返回一个值,显然,如果表为空或没有{{1},现在您将获得no_data_found
出现两次;和keyvalue
如果多个too_many_rows
有重复项。只有当您只有一个keyvalue
具有重复项时,它才会起作用。
你没有展示其余的逻辑,但大概是你正在根据返回的值做某事,在这种情况下 - 如果只有一个keyvalue
,这是不可能的 - 你可以省略keyvalue
子句,只测试值:
HAVING
但充其量,它告诉你的是,是否有任何SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue;
IF cntmismatch > 1 THEN
... -- some processing
END IF:
出现不止一次;它没有告诉你他们keyvalue
是什么,但仍然无法应对不止一个。
如果要检索具有多个匹配行的所有值并对其执行某些操作,则可以使用游标:
keyvalue
答案 1 :(得分:1)
如果您想要计算多次keyvalue
的值,您需要使用一个子选择:
SELECT COUNT(*) INTO cntmismatch
FROM
( SELECT keyvalue, count(*) FROM tbl_temp GROUP BY keyvalue HAVING count(*) > 1)
答案 2 :(得分:0)
您应该只是在代码中捕获并处理异常。 在您的情况下,您将获得NO_DATA_FOUND异常。
下面你会看到一个例子。
PROCEDURE count_mismatch AS
cntmismatch NUMBER;
BEGIN
BEGIN
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue;
EXCEPTION
WHEN no_data_found THEN
cntmismatch := -1;
END;
END
我认为,你不再需要HAVING条款了。因此我删除了它。 如果您的语句将返回超过预期的1行,那么您还必须处理TOO_MANY_ROWS异常!
答案 3 :(得分:0)
试试这个
BEGIN
SELECT COUNT(keyvalue) INTO cntmismatch
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1
EXCEPTION
WHEN no_data_found THEN cntmismatch := 0;
END;