2010-07-21 95 views
2

我在test.sql文件中有下面的代码。当test_summary表中有记录时,一切正常。但是当表内没有记录时,它就会失败。我希望它继续打印dbms_output消息,并在没有记录时进行处理。我怎样才能做到这一点?sql select into

declare 

    total_var  number(20,2) := 0.0; 
    nl_var   number(20,2) := 0.0; 

begin 

    select col1,col2 
    into total_var,nl_var 
    from testsch.test_summary; 

    dbms_output.put_LINE(''); 
    dbms_output.put_LINE('testing1' || total_var); 
    dbms_output.put_LINE('testing2' || nl_var); 

end; 

回答

8

我想添加一个简单的NO_DATA_FOUND异常处理程序。

declare 
    total_var  number(20,2) := 0.0; 
    nl_var   number(20,2) := 0.0; 
begin 
    begin 
     select col1,col2 
     into total_var,nl_var 
     from testsch.test_summary; 
    exception 
     when no_data_found then null; 
    end; 
    dbms_output.put_LINE(''); 
    dbms_output.put_LINE('testing1' || total_var); 
    dbms_output.put_LINE('testing2' || nl_var); 
end; 
+1

好吧,但是您也必须处理TOO_MANY_ROWS异常,请添加回答:) – ThinkJet 2010-07-21 13:57:19

0

除了加里是完全有效的答案,你也可以彻底避免该错误使用显式游标:

declare 
    total_var  number(20,2) := 0.0; 
    nl_var   number(20,2) := 0.0; 
    cursor cur_test_summary is 
     select col1,col2 
     from testsch.test_summary; 
begin 
    open cur_test_summary; 
    fetch cur_test_summary into total_var, nl_var; 
    close cur_test_summary; 
    dbms_output.put_LINE(''); 
    dbms_output.put_LINE('testing1' || total_var); 
    dbms_output.put_LINE('testing2' || nl_var); 
end; 
0

我喜欢用异常变异(请参阅从@Gary答案),但有是另一种常见的变体,带有问题的拨号:

declare 

    total_var  number(20,2) := 0.0; 
    nl_var   number(20,2) := 0.0; 

begin 

    select max(col1) , max(col2) 
    into total_var,nl_var 
    from testsch.test_summary; 

    dbms_output.put_LINE(''); 
    dbms_output.put_LINE('testing1' || total_var); 
    dbms_output.put_LINE('testing2' || nl_var); 

end; 

您可以使用min() - 无所谓。 如果没有数据发现变量中有空值

0

可以一口气做到这一切。避免找不到和我认为太多的行。

select col1,col2 into total_var,nl_var 
from 
(
    select col1,col2 from 
    (
     select col1,col2 
     from testsch.test_summary 
     UNION ALL 
     select null,null from dual 
    ) t1 order by col1 
) where rownum = 1