BEGIN / END中使用的绑定变量被清除

时间:2017-04-13 20:25:12

标签: oracle oracle-sqldeveloper oracle12c

这是一个简单的例子,因此很容易重现,但重要的是我需要使用into :someVariable from sometable where sometable.somecolumn = :y基于查询设置变量,然后在BEGIN / END块之后利用这两个变量。 似乎引用:y中的where会导致其被清除。为什么会这样?

我更关心的是为什么会发生这种情况而不是如何解决它。我有解决它自己的问题,但这似乎是一个奇怪的副作用。在第一个例子中,我没有声明一个名为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  

1 个答案:

答案 0 :(得分:0)

升级到SQL Developer 17.2.0.188,它就消失了。

似乎是这个错误:https://stackoverflow.com/a/43501389/84206