首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle存储过程中出现故障

Oracle存储过程中出现故障
EN

Stack Overflow用户
提问于 2013-07-12 18:26:46
回答 4查看 239关注 0票数 0

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

代码语言:javascript
运行
复制
cntmismatch NUMBER;

SELECT COUNT(keyvalue) INTO cntmismatch 
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1

如果没有满足上述条件的数据,则失败

我甚至试着用

代码语言:javascript
运行
复制
SELECT NVL(COUNT(keyvalue),0) INTO cntmismatch 
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1

但是它仍然在这里返回null,并且proc失败

EN

回答 4

Stack Overflow用户

发布于 2013-07-12 18:37:25

查询:

代码语言:javascript
运行
复制
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue

..。将尝试为每个keyvaluecntmismatch中返回一行,如果表为空,则返回no_data_found,如果存在多个keyvalue,则返回too_many_rows

添加:

代码语言:javascript
运行
复制
HAVING count(keyvalue) > 1

..。很明显,这意味着它只会为包含多个条目的任何keyvalue返回值,因此如果表为空或没有keyvalue出现两次,则返回no_data_found;如果多个keyvalue有重复项,则返回too_many_rows。只有当你恰好有一个重复的keyvalue时,它才会起作用。

您还没有展示其余的逻辑,但是假设您正在根据该返回值执行某些操作,在这种情况下-如果只有一个keyvalue (这是不太可能的)-您可以省略HAVING子句,只测试值:

代码语言:javascript
运行
复制
SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue;
IF cntmismatch > 1 THEN
   ... -- some processing
END IF:

但充其量,它只会告诉您是否存在多次出现的keyvalue;它不会告诉您它们的keyvalue是什么,并且仍然无法处理存在多个and的情况。

如果您希望检索具有多个匹配行的所有值,并对其执行某些操作,则可以使用游标:

代码语言:javascript
运行
复制
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;
票数 3
EN

Stack Overflow用户

发布于 2013-07-12 18:37:16

如果您想要计算keyvalue的值多次出现的次数,则需要使用子选择:

代码语言:javascript
运行
复制
SELECT COUNT(*) INTO cntmismatch 
FROM
( SELECT keyvalue, count(*) FROM tbl_temp GROUP BY keyvalue HAVING count(*) > 1)
票数 1
EN

Stack Overflow用户

发布于 2013-07-12 18:39:11

您只需在代码中捕获并处理异常即可。在您的例子中,您将得到一个NO_DATA_FOUND异常。

下面你会看到一个例子。

代码语言:javascript
运行
复制
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异常!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17612822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档