首先以一个例子说明一下where子句中比较语句的问题。
DECLARE Department char(3);
begin
Department:='CS';
delete from classes
where department=Department;
如果执行以上语句将产生灾难性的后果即:classes里的数据将全部删除,而不仅仅是那些department为CS的行。之所以出现这种情况,是因为SQL语句中标识符的分析方法。当PL/SQL引擎看到一个类似下面的条件:exp1=exp2
exp1和exp2首先要被查看是否与操作的表中的列相匹配,然后再检查它们是否是PL/SQL语句块中的变量。PL/SQL是不区分大小写的,因此在上面的例子中,department和Department与classes表中的列相符,而不是与变量相符。
如果该语句块有一标号,就可以使用与表列相同名字的变量,这只要在变量引用前加上标号就行了。这样,就能只删除那些满足department='CS'的行。
《1_DeleteBlock》
DECLARE Department char(3);
begin
Department:='CS';
delete from classes
where department=1_DeleteBlock.Department;
需要说明的是,这种方法可以产生预期的效果,但不是一种好的编程风格。