一个颠覆我认知的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。

举报
评论 0