BEGIN/END 中使用的绑定变量被清除
Bind variable used in BEGIN/END gets cleared
这是一个简单的示例,因此很容易重现,但重要的是我需要根据使用 into :someVariable from sometable where sometable.somecolumn = :y
的查询设置一个变量,然后在 BEGIN/END 之后利用两个变量堵塞。 似乎在 where
中引用 :y
导致它被清除。为什么会这样?
我更关心为什么会发生这种情况,而不是如何解决它。我有办法自行设置它,但这似乎是一个奇怪的副作用。在第一个示例中,我没有声明一个名为 :y 的新变量,所以我认为这不是变量隐藏的问题。显然,第二个示例表明我可以设置变量的值,并且设置它在块范围之外可见,这是我期望的,因为变量是在块范围之外声明的。
clear screen;
variable x varchar2(10);
variable y varchar2(10);
exec :y := 'YYY';
BEGIN
select '1' into :x
from dual
where 'YYY' = :y;
END;
/
select :y from dual;
输出显示:y 已清除:
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
:Y
--------------------------------
如果我将 :y 设置为自身,该值将被保留:
clear screen;
variable x varchar2(10);
variable y varchar2(10);
exec :y := 'YYY';
BEGIN
select '1' into :x
from dual
where 'YYY' = :y;
:y := :y;
END;
/
select :y from dual;
输出:
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
:Y
--------------------------------
YYY
升级到 SQL 开发者 17.2.0.188,它消失了。
似乎是这个错误:
这是一个简单的示例,因此很容易重现,但重要的是我需要根据使用 into :someVariable from sometable where sometable.somecolumn = :y
的查询设置一个变量,然后在 BEGIN/END 之后利用两个变量堵塞。 似乎在 where
中引用 :y
导致它被清除。为什么会这样?
我更关心为什么会发生这种情况,而不是如何解决它。我有办法自行设置它,但这似乎是一个奇怪的副作用。在第一个示例中,我没有声明一个名为 :y 的新变量,所以我认为这不是变量隐藏的问题。显然,第二个示例表明我可以设置变量的值,并且设置它在块范围之外可见,这是我期望的,因为变量是在块范围之外声明的。
clear screen;
variable x varchar2(10);
variable y varchar2(10);
exec :y := 'YYY';
BEGIN
select '1' into :x
from dual
where 'YYY' = :y;
END;
/
select :y from dual;
输出显示:y 已清除:
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
:Y
--------------------------------
如果我将 :y 设置为自身,该值将被保留:
clear screen;
variable x varchar2(10);
variable y varchar2(10);
exec :y := 'YYY';
BEGIN
select '1' into :x
from dual
where 'YYY' = :y;
:y := :y;
END;
/
select :y from dual;
输出:
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
:Y
--------------------------------
YYY
升级到 SQL 开发者 17.2.0.188,它消失了。
似乎是这个错误: