一个颠覆我认知的PL/SQL语句
话不多说,请看下面的语句:
DECLARE
l_user_id NUMBER;
l_user_name VARCHAR2(150);
BEGIN
BEGIN
SELECT fu.user_id
,fu.user_name
INTO l_user_id
,l_user_name
FROM apps.fnd_user fu
WHERE fu.user_name IN ('JERRY', 'TOM');
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
dbms_output.put_line('l_user_id: ' || l_user_id || '; l_user_name: ' || l_user_name);
END;
上面语句中fnd_user表是有JERRY和TOM两条记录的,你觉得这个语句会输出什么样的值?
程序已经执行到异常里了,变量l_user_id、l_user_name还是之前的值,即空值,不知道你是不是这么认为的,反正我是这么理解的。
但是当我查看Output时,碉堡了,变量l_user_id、l_user_name均有值输出来。
原因或者说原理,我也不清楚(有知道的欢迎留言交流),但是事实就是这样。
但是这给我们一个警示,对于selectinto赋值语句,一定要慎重考虑异常的处理,切忌随随便便写个“when others then null”了事。
我们可以再拓展一下,如果把变量l_user_name定义为NUMBER类型,select也只查询出一条记录的情况下,这个语句又会输出什么呢?有兴趣的可以尝试一下。BTW,我使用的是Oracle Database 11g。
请先 后发表评论~