Разумное решение SELECT ... INTO Oracle для случая нескольких ИЛИ без строк - PullRequest
1 голос
/ 07 марта 2009

Я просто хочу ВЫБРАТЬ значения в переменные изнутри процедуры.

ВЫБРАТЬ blah1, blah2 INTO var1_, var2_ ОТ ...

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

Без строк = без изменения значения, Несколько строк = использовать последний

Я могу достаточно легко ограничить результирующий набор для случая «нескольких строк», но «без строк» ​​намного сложнее в ситуациях, когда вы не можете использовать агрегатную функцию в SELECT.

Существуют ли какие-либо специальные обходные пути или предложения? Стараемся избежать значительного переписывания запросов или выполнения дважды для получения количества строк перед выполнением SELECT INTO.

Ответы [ 2 ]

5 голосов
/ 07 марта 2009

Что не так с использованием блока исключений?

  create or replace
procedure p(v_job VARCHAR2) IS
 v_ename VARCHAR2(255);
begin

 select ename into v_ename 
 from (
  select ename
  from scott.emp 
  where job = v_job
  order by v_ename desc )
 where rownum = 1;

 DBMS_OUTPUT.PUT_LINE('Found Rows Logic Here -> Found ' || v_ename);
 EXCEPTION WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE('No Rows found logic here');

end;


SQL>  begin
   p('FOO');
   p('CLERK');
  end;  2    3    4  
  5  /
No Rows found logic here
Found Rows Logic Here -> Found SMITH


PL/SQL procedure successfully completed.

SQL> 
1 голос
/ 24 января 2013

Вы можете использовать цикл for. Цикл for ничего не будет делать для возвращаемых строк и будет применяться к каждой возвращаемой строке, если есть где кратно. Вы можете настроить свой выбор так, чтобы он возвращал только последний ряд.

begin   
    for ARow in (select *
                  from tableA ta
                  Where ta.value = ???) loop                           
        -- do something to ARow
    end loop;   
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...