PL/SQL变量名和表中列名相同的错误

 话不多说,先来看一个例子吧。

SQL> desc string Name Null? Type ----------------------------------------- -------- ---------------------------- NAME CHAR(3) SQL> select * from string; NAM --- C B A SQL> declare 2 name char(3); 3 begin 4 name:='B'; 5 delete from string 6 where name=name; 7 end; 8 / PL/SQL procedure successfully completed. SQL> select * from string; no rows selected

 

从上面这个例子可以看出,当变量名name和表string中的列名NAME相同时,则会造成严重的后果--表string中所有的记录都会被删除!

 

之所以发生这种情况是因为SQL语句中的标示符被分析的方式时特别的。当PL/SQL引擎看到一个条件类似于exp1=exp2的时候,exp1和exp2首先被查看,看看它们是否与要操作的表中的列相匹配,然后再检查它们是否是PL/SQL块中的变量。PL/SQL是大小写不敏感的,因此上面那个例子中的name和NAME都与string表中的列相关联,而不是与变量相匹配。这个条件将对表中的每个行都求值为TRUE,这样所有的行就被删除了。

 

一个解决的办法是使用标签,我们仍然可以对变量使用与表列相同的名字,只要在变量引用之前放置标签就可以了。如下所示

 

SQL> rollback; Rollback complete. SQL> select * from string; NAM --- C B A SQL> <<lbl>> 2 declare 3 name char(3); 4 begin 5 name:='B'; 6 delete from string 7 where name=lbl.name; 8 end; 9 / PL/SQL procedure successfully completed. SQL> select * from string; NAM --- C A SQL>

 

我觉得这虽然可以解决问题,可毕竟不是长久之策。在编写PL/SQL代码的时候还是要养成良好的编程风格,这样才会使自己写的代码更容易被别人看懂,也容易自己将来维护。

你可能感兴趣的:(sql,编程,String,delete,引擎)