2009-03-07 4 views
1

プロシージャ内から変数に値をSELECTしたいだけです。合理的なSELECT ...複数のOR行がない場合のOracleソリューションへ

SELECT blah1、blah2 var1_ INTO、時には大規模で複雑なクエリは、時にはそれが複数あるだろう何行もありません

... FROM をvar2_ - 両方のケースは例外につながります。私はへの暗黙の行動似と例外動作を交換するのが大好きだ:

ノー行=なし値の変更、複数行=使用最後

私は、「複数行」の場合のために、容易に十分な結果セットを制約することができますが、 SELECTで集計関数を使用できない状況では、「行がありません」がはるかに困難です。

特別な回避策や提案はありますか? SELECT INTOを実行する前に、クエリを大幅に書き換えたり、行数を取得するために2回実行したりしないようにします。

答えて

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> 
+0

また、クエリをカーソルとして宣言し、開いて1回フェッチし、%found属性をチェックすることもできます。 – kurosch

1

forループを使用できます。 forループは、返された行がない場合は何も実行せず、複数の場合に返されるすべての行に適用されます。最後の行のみを返すように選択を調整することができます。

begin 
    for ARow in (select * 
        from tableA ta 
        Where ta.value = ???) loop       
     -- do something to ARow 
    end loop; 
end; 
関連する問題