作者:王军
通常在使用SQL数据查询时,要使用不同的数据库资源共同查询目标项的存在,要利用到缓存(CASH)处理技术。
也就是说先查本地资源,再查远程或利用其他手段得到其资源与之对应的条目。
简单的说存在本地数据库表 A,与远程数据库资源FAR 下的同结构表B。查询在一定条件下的记录,
比如说身份证信息。A 代表XJ市居民数据库,B 代表全国数据库。
在XJ当地居民普查时,首先查询本地数据库资源,在没有查询结果时,远程查询全国资源库。
SQL传统的作法是
SELECT 姓名,性别,住址 FROM A WHERE 身份证号码=’123456789012’
EXCEPTION
WHEN NO_DATA_FOUND THEN
SELECT 姓名,性别,住址 FROM B@FAR
WHEN OTHERS THEN
其他处理
END
可以看到处理机制是在错误处理段内。继续可能会带来不可预料的后果。
ORACLE 利用光标(sqlcur)处理时也是在判断 sqlcur和 NOTFOUND 的与操作
来判断是否查找到例如
CURSOR c1 Is SELECT 姓名,性别,住址 FROM A WHERE 身份证号码=’123456789012’
FETCH C1; WHILE C1%FOUND LOOP
处理;
END LOOP;
IF C1%NOTFOUND THEN
SELECT 姓名,性别,住址 FROM B@FAR;
END IF;
可以看出处理较为复杂,并切不通用。
笔者提出一种替代算法,算法的核心是集合加法运算,用数字代替NOTFOUND
达到安全,可靠,并且通用与便于利用。
对于上述的解决方案是
SELECT ROWNUM,姓名,性别,住址 FROM A WHERE 身份证号码=’123456789012’
UNION ALL
SELECT NVL(null,0),null,null,null from dual
在利用变量时
select ROWNUM,姓名,性别,住址 into 变量1, 变量2, 变量3, 变量4
from (
SELECT ROWNUM,姓名,性别,住址 FROM A WHERE 身份证号码=’123456789012’
UNION ALL SELECT NVL(null,0),null,null,null from dual
)
where rownum=1;
IF 变量1=0 THEN (没有找到)
SELECT 姓名,性别,住址 FROM B@FAR
END IF