两个异常给出plsql块中的错误

两个异常给出plsql块中的错误,plsql,oracle11g,Plsql,Oracle11g,如果表中有任何K状态,我需要返回。当并没有K状态时,它不会返回任何行,所以进入部分会给出错误。因此,我添加了一个异常,并最终得到0 status_count,但这次在plsql块的末尾有一个最终异常 当查询不返回行时,我应该返回0还是需要处理2个异常?有什么建议吗 BEGIN SELECT COUNT(1) INTO v_status_count FROM tablename WHERE STATUS = 'K' AND ACCOUNT_NUMBER = o_accou

如果表中有任何K状态,我需要返回。当并没有K状态时,它不会返回任何行,所以进入部分会给出错误。因此,我添加了一个异常,并最终得到0 status_count,但这次在plsql块的末尾有一个最终异常

当查询不返回行时,我应该返回0还是需要处理2个异常?有什么建议吗

BEGIN
SELECT COUNT(1) INTO v_status_count 
    FROM tablename
    WHERE STATUS = 'K'
    AND ACCOUNT_NUMBER = o_account_number
    GROUP BY STATUS;
    EXCEPTION WHEN NO_DATA_FOUND THEN
       v_status_count := 0;  

    IF v_status_count > 0 THEN
     o_status := 'Y';
    END IF;

 EXCEPTION WHEN OTHERS THEN
     o_result := 1;
END;

不要等待你想要实现的,但是

DECLARE 
    v_status_count NUMBER :=0;

    BEGIN


 SELECT COUNT(1) INTO v_status_count 
        FROM tablename
        WHERE STATUS = 'K'
        AND ACCOUNT_NUMBER = o_account_number
        GROUP BY STATUS;


     EXCEPTION 
      WHEN NO_DATA_FOUND THEN
           v_status_count := 0;  

     WHEN OTHERS THEN
         o_result := 1;
    END;

删除您的
group by
子句,在这种情况下不需要它

不幸的是,您正在寻找的内容有点不清楚。在下面的示例中,我假设您想知道数据库中是否存在帐号和状态组合

数据设置

create table accounts (
  account_number number,
  status varchar2(1)
);

insert into accounts values (1, 'K');
insert into accounts values (2, 'L');

select * from accounts;

ACCOUNT_NUMBER S
-------------- -
             1 K
             2 L
程序

create or replace procedure get_account_status(
  p_account_number in number,
  p_status in varchar2,
  o_status out varchar2,
  o_result out number
) is
  v_count number;
begin
  -- the select that never throws:
  -- v_count = 0 if no account with requested status found
  -- v_count = 1 if at least one row with account and status is found
  -- note rownum = 1 is valid restriction as it's enough to know that at least
  -- one row exists
  select count(*)
    into v_count
    from accounts
   where status = p_status
     and account_number = p_account_number
     and rownum = 1;

  -- adjust the return/output value(s) as you like
  if v_count = 1 then
    o_status := 'Y';
    o_result := 1;
  else 
    o_status := 'N';
    o_result := 0;
  end if;

end;
/
show errors
试块和结果

declare
  v_status varchar2(1);
  v_result number;
begin
  get_account_status(1, 'K', v_status, v_result);
  dbms_output.put_line('v_status = ' || v_status  ||
                       '; v_result = ' || v_result);

  get_account_status(2, 'K', v_status, v_result);
  dbms_output.put_line('v_status = ' || v_status  ||
                       '; v_result = ' || v_result);

  get_account_status(3, 'K', v_status, v_result);
  dbms_output.put_line('v_status = ' || v_status  ||
                       '; v_result = ' || v_result);
end;
/

v_status = Y; v_result = 1
v_status = N; v_result = 0
v_status = N; v_result = 0

PL/SQL procedure successfully completed.

Alex,这不是真的,当你将
count
groupby
组合时,你可以得到零行,例如。g<代码>从dual中选择count(*),其中dummy='Y'按dummy分组我删除了分组依据。可以,但在不返回行时仍无法处理。我只能通过捕获“未找到数据”异常来处理它。我解决了最终异常和内部异常之间的冲突,用begin-end包围了我的控件。请提供过程的全文及其标题