Oracle存储过程失败

时间:2013-07-12 10:26:46

标签: sql oracle

我的存储过程存在问题。 它在以下情况下失败

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失败

4 个答案:

答案 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;