【问题标题】:Not enough values when returning a duplicate count返回重复计数时值不足
【发布时间】:2013-03-05 05:51:07
【问题描述】:

我正在尝试在 Iracle 中创建一个存储过程,它应该从单个表中返回重复记录的计数。

我正在尝试将该计数的结果返回给用户。目前我收到错误“Error(6,78): PL/SQL: ORA-00947: not enough values”

我做错了什么?

CREATE OR REPLACE PROCEDURE DUPLICATECHECK (p_result OUT number)  
IS
theResult number;
BEGIN
   SELECT FIRST_NAME, LAST_NAME, COUNT(1) as "Duplicate Found" INTO theResult 
   FROM EMPLOYEE GROUP BY FIRST_NAME, LAST_NAME HAVING COUNT(*) > 1;
p_result := theResult;
END DUPLICATECHECK;

【问题讨论】:

  • 使用 count(*) 代替 count(1)

标签: oracle plsql duplicates


【解决方案1】:

你的问题是这一行:

SELECT FIRST_NAME, LAST_NAME, COUNT(1) as "Duplicate Found" INTO theResult 

具体来说,您将 3 个不同的列放入一个结果中,您没有足够的值。

因为您只寻找一个值,但您应该只选择那个值

select count(*)
  into p_result
  from ( select first_name, last_name
           from employee
          group by first_name, last_name
         having count(*) > 1 )

如果您必须使用可以直接在 OUT 参数中选择的过程,则不需要局部变量。为什么你使用过程而不是函数呢?

把这些放在一起你会得到:

create or replace function duplicatecheck ( 
         p_result out number ) is
begin

    select count(*)
      into p_result
      from ( select first_name, last_name
               from employee
              group by first_name, last_name
             having count(*) > 1 )

end duplicatecheck;

如果您真的想强制执行唯一性,您应该创建一个unique constraint,尽管我不建议这样做;不能保证您不会有两个同名的员工。

【讨论】:

  • 谢谢,我正在试验 Oracle PL/SQL。我将如何在 Oracle SQL Developer 中执行函数或存储过程?像这样的东西会起作用吗? var myResult integer; execute duplicatecheck(:myResult); print myResult;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多