合理的SELECT ... INTO Oracle解决方案,适用于多个OR无行的情况

时间:2009-03-07 08:08:00

标签: oracle

我只想将值从过程内部变为SELECT变量。

SELECT blah1,blah2 INTO var1_,var2_ 来自......

有时,大型复杂查询将没有行,有时它会有多个 - 两种情况都会导致异常。我希望用类似的隐式行为替换异常行为:

没有行=没有值更改,多行=使用最后

对于“多行”情况,我可以很容易地约束结果集,但对于无法在SELECT中使用聚合函数的情况,“无行”会更加困难。

是否有任何特殊的解决方法或建议?在执行SELECT INTO之前,希望避免显着重写查询或执行两次以获取行数。

2 个答案:

答案 0 :(得分:5)

使用异常块有什么问题?

  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 :(得分:1)

你可以使用for循环。对于没有返回的行,for循环将不执行任何操作,并且如果存在多个行,则将应用于返回的每一行。您可以调整您的选择,使其仅返回最后一行。

begin   
    for ARow in (select *
                  from tableA ta
                  Where ta.value = ???) loop                           
        -- do something to ARow
    end loop;   
end;