典型的例子:
查看是否存在一条记录满足<特定条件> 。存在则<做一些处理>。
例如:检查是否有员工上个月聘用的。
差劲的SQL:
select
count
(
*
)
from emp
where hiredate > trunc(sysdate, ' MM ' );
from emp
where hiredate > trunc(sysdate, ' MM ' );
这是一个差劲的SQL,因为我们并不需要员工数量。通过对结果集的所有记录计数,从而验证至少有一行是满足条件的,这样并不高效。
PL/SQL的方案,可以用显式游标和%FOUND属性来执行单个的读取。
CREATE
OR
REPLACE
FUNCTION
IS_EMP_THERE
RETURN
VARCHAR2
IS
CURSOR C IS
SELECT 1
FROM emp
WHERE hiredate > TRUNC(SYSDATE, ' MM ' );
r NUMBER ;
v VARCHAR2 ( 3 );
BEGIN
OPEN C;
FETCH c
INTO r;
IF c % FOUND THEN
v : = ' YES ' ;
ELSE
v : = ' NO ' ;
END IF ;
CLOSE c;
RETURN v;
END ;
CURSOR C IS
SELECT 1
FROM emp
WHERE hiredate > TRUNC(SYSDATE, ' MM ' );
r NUMBER ;
v VARCHAR2 ( 3 );
BEGIN
OPEN C;
FETCH c
INTO r;
IF c % FOUND THEN
v : = ' YES ' ;
ELSE
v : = ' NO ' ;
END IF ;
CLOSE c;
RETURN v;
END ;
虽然读取单个记录确实比读取结果集的所有记录高效,但这个方法是PLSQL的方法,当有适合的SQL方法可以使用时,尽量使用SQL,因为SQL会比PLSQL高效得多。
SQL解决方法:
SELECT
COUNT
(
1
)
FROM dual
WHERE EXISTS ( SELECT NULL
FROM emp
WHERE hiredate > TRUNC(SYSDATE, ' MM ' ));
FROM dual
WHERE EXISTS ( SELECT NULL
FROM emp
WHERE hiredate > TRUNC(SYSDATE, ' MM ' ));
结果:如果存在返回1,不存在返回0,所以根本不需要使用PLSQL。