代码之家  ›  专栏  ›  技术社区  ›  Einstein

针对多行或无行的情况,将…合理地选择到Oracle解决方案中

  •  1
  • Einstein  · 技术社区  · 16 年前

    从…起

    有时大型复杂查询将没有行,有时它将有多个行——这两种情况都会导致异常。我很想用类似于以下内容的隐式行为替换异常行为:

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

    有什么特别的解决办法或建议吗?希望避免明显重写查询或在执行SELECT INTO之前执行两次以获取行数。

    2 回复  |  直到 16 年前
        1
  •  5
  •   Matthew Watson    16 年前

    使用异常块有什么问题?

      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> 
    
        2
  •  1
  •   Rylander    12 年前

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

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