一个替代SQL NOTFOUND的算法

作者:王军

通常在使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值