PL/SQL中使用EXISTS:使用LOOP循环替代或者SELECT实现类似的功能:

EXISTS 指定一个子查询,用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False,检测行的存在。

语法:EXISTS subquery。参数 subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。结果类型为 Boolean,如果子查询包含行,则返回 TRUE。

上述的功能在T-SQL中可以直接使用,但是在PL/SQL中,会出现如下的问题:

1 BEGIN
2 IF EXISTS(SELECT * FROM EMP) THEN
3 DBMS_OUTPUT.PUT_LINE();
4 ELSE
5 DBMS_OUTPUT.PUT_LINE();
6 END IF;
7 END;

类似的业务逻辑如下:

1 IF EXISTS (SELECT * FROM tbl_some_table WHERE some_condition) THEN
2 -- Do something here;
3 ELSE
4 -- DO something else
5 END IF;

但是直接使用会存在问题:

方法1:使用LOOP,LOOP中使用EXIT直接退出,保证只执行一次:

1 declare found boolean := false;
2 for x in (SELECT * FROM tbl_some_table WHERE some_condition) loop
3 found := true;
4 -- Do something here;
5 end loop;
6 IF not found THEN
7 -- DO something else
8 END IF;

为了保证执行一次:可以如下

1 for x in (SELECT * FROM tbl_some_table WHERE some_condition AND ROWNUM = 1) loop

或者:直接EXIT保证执行一次就退出FOR循环

declare 
found boolean := false;
for x in (SELECT * FROM tbl_some_table WHERE some_condition) loop
found := true;
-- Do something here;
exit;
end loop;
IF not found THEN
-- DO something else
END IF;

方法二:使用count总数,使用AND ROWNUM = 1限制结果数量

 1 DECLARE
2 l_exists INTEGER;
3 BEGIN
4 SELECT COUNT(*) INTO l_exists
5 FROM some_table
6 WHERE some_condition
7 AND ROWNUM = 1;
8 IF l_exists = 1 THEN
9 -- Do something
10 ELSE
11 -- Do something else
12 END IF;
13 END;

参考网站:http://www.dbforums.com/oracle/1001443-if-exists-select-then.html

posted on 2012-01-11 16:54  Coldest Winter  阅读(777)  评论(0编辑  收藏  举报