2012-02-15 12 views
1

PLSQLで次のようなことをすることはできますか?PLSQLの条件文でクエリを使用していますか?

if (some_query) then 
    dbms_output.put_line('Your query returned at least 1 row.'); 
else 
    dbms_output.put_line('Your query returned no rows.'); 
end if; 

私の使用例は、自分のデータベースに値がすでに存在するかどうかをチェックしたいのですが、値がすでに存在している場合は、値がまったく存在しない場合とは異なる処理を行います。ご利用の場合は、クエリが1行または1千を返すかどうかを同じように動作しますので

答えて

4

あなたがレコードの存在を確認する場合は、からCOUNT(*)を選択することができますそれは常にあなたがチェックできる値を返しますよう、ソーステーブルのキーに基づいて:

SQL> set serverout on 
SQL> DECLARE 
    2  v_check NUMBER; 
    3 BEGIN 
    4  SELECT COUNT(*) 
    5  INTO v_check 
    6  FROM DUAL 
    7  WHERE DUMMY = 'X' 
    8  AND ROWNUM = 1; 
    9 
10  if (v_check = 0) then 
11   dbms_output.put_line('Your query returned no rows.'); 
12  else 
13   dbms_output.put_line('Your query returned at least 1 row.'); 
14  end if; 
15 END; 
16/
Your query returned at least 1 row. 

PL/SQL procedure successfully completed. 

SQL> 
+0

rownum = 1についての部分を説明しますか?これにより、それ以外の場合は100万行になる可能性のあるクエリの速度が向上しますか?それとも、1または0のブール値を取得するのはいい方法ですか? – Buttons840

+0

@ Buttons840修正します。キー以外のフィールドが存在するかどうかを検索する場合は、where句を満たす最初のレコードが見つかったときにクエリをオフにします。コードロジックは0の場合をチェックしているので、実際のカウントは使用されません。 – tawman

+0

@ Buttons840まさに!私の答えは左から右に評価されます。あなたのORの最初の部分は正しい;) – tawman

1

EXISTS使用:

DECLARE 
    l_dummy  VARCHAR2(1); 
BEGIN 
    SELECT NULL 
    INTO l_dummy 
    FROM DUAL 
    WHERE EXISTS (SELECT NULL 
        FROM <some_query>); 
    DBMS_OUTPUT.PUT_LINE('Your query returned at least one row.'); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     DBMS_OUTPUT.PUT_LINE('Your query returned no rows.'); 
END; 
3

あなたは

BEGIN 
    SELECT 1 
    INTO l_foo 
    FROM dual 
    WHERE EXISTS (<<some query>>); 

    dbms_output.put_line('Your query returned at least 1 row'); 
EXCEPTION 
    WHEN no_data_found 
    THEN 
    dbms_output.put_line('Your query returned 0 rows'); 
END; 
のような何かをする必要があると思います

クエリがあまりにも高価でない場合は、単純に何か

SELECT COUNT(*) 
    INTO l_foo 
    FROM (<<some query>>) 
WHERE rownum = 1; 

IF(l_foo = 1) 
THEN 
    dbms_output.put_line('Your query returned at least row.'); 
ELSE 
    dbms_output.put_line('Your query returned 0 rows.'); 
END IF; 
2

全く同じことを行う場合、それはありません、ほぼ同じ効率的かつ維持するために、おそらく少し容易になります。しかし、あなたがそれを偽造するにはいくつかの方法があります:

あなたの値が存在するかどうかを確認する暗黙的なカーソルの中で行うことが1つだけ必要な場合。

for i in (some_query) loop 

    do_something; 

end loop; 

ます。また、ここに値を設定しif

for i in (some_query) loop 

    result := True; 

end loop; 

if result then 
    do_something; 
else 
    do_something_else; 
end if; 

それとも、明示カーソルを使用して

declare 

    cursor c_blah is 
    select my_value 
    from my_table 
    where id = my_id 
      ; 

    my_value varchar2(4000); 

begin 

    open c_blah(my_id); 
    fetch c_blah into my_value; 
    close c_blah; 

    do_something; 

    exception when no_data_found then 
    do_something_else; 

end; 
を提起することがあります no_data_foundエラーをキャッチすることができ、それを使用することができます
関連する問題