Thomas Zhang的杂货铺
14 11, 2008
plsql cursor中变量命名不规范导致的问题
作者 tomszrp 13:06 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 磨刀石

今天看到一个帖子,因为一段plsql脚本中变量命名不规范,导致结果异常的问题,类似如下:

declare
v_num number:=0;
cursor c_cur (tablespace_name in varchar2) is
select count(*) cc
from user_tables
where tablespace_name=tablespace_name;
begin
open c_cur('DATA_01');
fetch c_cur into v_num;
close c_cur;
dbms_output.put_line('v_num='||v_num);
end;
/

这段代码看上去没有什么问题,可实际上Oracle在解析这段代码的时候,并没有将实参真正的替换过来.
而是直接使用了
where tablespace_name=tablespace_name的恒等条件.

所以结果就自然不对了.

SQL> declare
2 v_num number:=0;
3 cursor c_cur (tablespace_name in varchar2) is
4 select count(*) cc
5 from user_tables
6 where tablespace_name=tablespace_name;
7 begin
8 open c_cur('DATA_01');
9 fetch c_cur into v_num;
10 close c_cur;
11 dbms_output.put_line('v_num='||v_num);
12 end;
13 /

v_num=10

PL/SQL procedure successfully completed

SQL> select count(*) from user_tables where tablespace_name='DATA_01';

COUNT(*)
----------
9

SQL>

修改起来自然比较简单,在此建议大家尽量不要编写类似容易引起歧义的PL/SQL脚本,从而避免错误的处理结果.
定义科学、合理的命名规范,是一个开发team首先应该必须遵守的.


Comments
发表评论
标题:


称呼:


邮箱地址(可选):


个人主页(可选):


发表评论:
Bold Italic Link authimage




博客日历
« 七月 2009 »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合