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