典型的例子:
查看是否存在一条记录满足<特定条件> 。存在则<做一些处理>。
例如:检查是否有员工上个月聘用的。
差劲的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。