我的存储过程有问题。在以下情况下失败
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失败
发布于 2013-07-12 18:37:25
查询:
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue
..。将尝试为每个keyvalue
在cntmismatch
中返回一行,如果表为空,则返回no_data_found
,如果存在多个keyvalue
,则返回too_many_rows
。
添加:
HAVING count(keyvalue) > 1
..。很明显,这意味着它只会为包含多个条目的任何keyvalue
返回值,因此如果表为空或没有keyvalue
出现两次,则返回no_data_found
;如果多个keyvalue
有重复项,则返回too_many_rows
。只有当你恰好有一个重复的keyvalue
时,它才会起作用。
您还没有展示其余的逻辑,但是假设您正在根据该返回值执行某些操作,在这种情况下-如果只有一个keyvalue
(这是不太可能的)-您可以省略HAVING
子句,只测试值:
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue;
IF cntmismatch > 1 THEN
... -- some processing
END IF:
但充其量,它只会告诉您是否存在多次出现的keyvalue
;它不会告诉您它们的keyvalue
是什么,并且仍然无法处理存在多个and的情况。
如果您希望检索具有多个匹配行的所有值,并对其执行某些操作,则可以使用游标:
FOR dup_keyvalues IN (SELECT keyvalue, COUNT(*) AS cnt
FROM tbl_temp GROUP BY keyvalue HAVING COUNT(*) > 1) LOOP
... - some processing, e.g.
DBMS_OUTPUT.PUT_LINE('keyvalue ' || dup_keyvalues.keyvalue
|| ' has ' || dup_keyvalues.cnt || ' matches');
...
END LOOP;
发布于 2013-07-12 18:37:16
如果您想要计算keyvalue
的值多次出现的次数,则需要使用子选择:
SELECT COUNT(*) INTO cntmismatch
FROM
( SELECT keyvalue, count(*) FROM tbl_temp GROUP BY keyvalue HAVING count(*) > 1)
发布于 2013-07-12 18:39:11
您只需在代码中捕获并处理异常即可。在您的例子中,您将得到一个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异常!
https://stackoverflow.com/questions/17612822
复制相似问题