sql выбрать в - PullRequest
       11

sql выбрать в

2 голосов
/ 21 июля 2010

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

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;

Ответы [ 4 ]

8 голосов
/ 21 июля 2010

Я бы добавил простой обработчик исключений 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;
0 голосов
/ 21 июля 2010

Может сделать все это за один раз.Избегайте не найденных и слишком много строк, я считаю.

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
0 голосов
/ 21 июля 2010

Я предпочитаю вариант с исключением (см. Ответ от @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 голосов
/ 21 июля 2010

В дополнение к совершенно правильному ответу Гари, вы также можете полностью избежать ошибки, используя явный курсор:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...