|
今天看到一个帖子,因为一段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首先应该必须遵守的.
|