【发布时间】:2017-06-06 21:11:27
【问题描述】:
我在 sql developer 中执行了简单的匿名块,期望从“FOO”表中删除 x 行,但是我最终得到了意外的结果,这反过来又删除了整行。
DECLARE
type pkarray IS VARRAY(3) OF RAW(16);
ids pkarray;
BEGIN
ids := pkarray('guid_value1','guid_value2','guid_value3');
FOR i in 1 .. 3 LOOP
FOR foo IN (SELECT FOO_ID FROM FOO WHERE BAR_ID = UPPER(ids(i))) LOOP
DELETE FROM FOO WHERE FOO_ID = foo.FOO_ID;
END LOOP;
END LOOP;
END;
但是,当我将游标变量“foo”更改为“abc”之类的其他值时,程序通过删除 x 行正常工作。我提前知道的数字 x。
【问题讨论】:
-
这取决于 Oracle 如何评估变量、表名......在您的查询中,
foo.id被视为“表foo的列id”,而不是“变量foo"的字段id,因此出现意外行为。您应该能够通过更改变量名称甚至通过在查询中为表foo使用别名(不同于foo)来更改此行为。这里有一个很好的答案,只是想找到它 -
范围和优先级规则适用于所有变量,而不仅仅是您的示例中的游标记录。想想当你
select * from foo where fid = 23和fid既是foo中的列名又是局部变量时会发生什么。 -
感谢您的回复。不幸的是,由于我对这个主题缺乏理解和经验,我仍然不完全理解它为什么会这样。然而,根据执行代码的观察,我使用游标 var 作为小写表名再次向自己确认会产生负面影响。我会继续阅读相关文章。感谢您的解释。
标签: variables plsql cursor naming-conventions shadowing