2010-07-21 5 views
2

У меня есть код ниже в файле test.sql. Когда в таблице test_summary есть запись, все работает нормально. Но когда в таблице нет записи, она терпит неудачу. Я хочу, чтобы он продолжал печатать сообщение dbms_output и обрабатывать, когда нет записи. Как я могу это сделать?sql select in

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

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