2012-02-15 77 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; 

我的用例是我想檢查一個值是否已經存在於我的數據庫中。如果這個值已經存在,那麼我會做一些不同的事情,如果這個值根本不存在的話。

回答

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的部分?這是否會提高查詢的速度,否則可能會計數一百萬行?或者它只是獲得1或0的布爾值的一個好方法? – Buttons840 2012-02-16 17:42:08

+0

@ Buttons840正確。如果您正在搜索非關鍵字段的存在,那麼在找到滿足where子句的第一條記錄時關閉該查詢。代碼邏輯正在檢查0的情況,所以不使用實際的計數。 – tawman 2012-02-16 20:57:33

+0

@ Buttons840正是!我的答案從左至右進行評估。你的OR的第一部分是正確的;) – tawman 2012-02-16 21:10:49

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

完全一樣,沒有任何維護。但有幾種方法可以僞造它:

如果您只需要做一件事,那麼在隱式遊標內部執行該操作即可確認您的值是否存在。

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; 

使用它,或者你可以使用顯式遊標,趕上no_data_found錯誤會引發

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;