2017-04-19 6 views
1

私は、1つのプロシージャからの出力が複数の後のプロシージャに必要なスクリプトを作成しています。ですから、置換変数ではなく、バインド変数が必要です。しかし、変数が使用されるたびに、変数はクリアされます。そのため、変数の値を複数回使用することは不可能です。まったく同じスクリプトがSQL * Plusで動作します。私はその問題を示す下の短いスクリプトを作成しました。スクリプト内のバインド変数をクリアするSQL Developer

これはSQL Developerで変更できる設定ですか?これはバグですか?私の場合は、SQL Developerバージョン4.1.5.21.78を使用しています。

var x varchar2(1) 
var y varchar2(1) 
print x 
print y 
exec :x := 'Z'; 
exec :y := 'Z'; 
print x 
print y 
exec :x := :y; 
-- Why did that last line clear y? 
print x 
print y 

出力は

X 
------ 


Y 
------ 


PL/SQL procedure successfully completed. 


PL/SQL procedure successfully completed. 


X 
- 
Z 

Y 
- 
Z 

PL/SQL procedure successfully completed. 


Y 
- 


X 
- 
Z 
+0

4.2.0.17では、最後の2つの印刷コマンドが両方ともZと表示されていません(出力がコードと一致していないことを示しています)それでも...)。私も4.1.5.21の問題を見ています。だから、そのバージョンのバグのように見えます。アップグレードは回避策のようですか? –

+0

これはこのバグの別の例かもしれないと思います:https://stackoverflow.com/q/43401127/84206 – AaronLS

答えて

1

これは、バージョン4.2.0.17で修正されました4.1.5のバグ、そしておそらく他のバージョン、のようです。

execは、無名ブロックのための単なるラッパーですが、また、代わりに、明示的なブロックを使用して、問題を示しています

begin 
    :x := :y; 
end; 
/

私は、これは以前に報告見てきたかなり確信しているが、唯一の例I見つけることができるis this question;それはあなたが自分自身に値を再割り当てすることによって、それを回避することができます指摘のとおり

begin 
    :x := :y; 
    :y := :y; 
end; 
/

またはわずかに少ない読み取り可能:

exec :x := :y; :y := :y; 

確かにバグのように見えますが、それは現在のリリースで修正されていますよう、upgradingはそれを解決するための賢明な方法のようです。それ以外の場合は、Oracleにサービスリクエストを提出する必要があります。とにかくアップグレードをアドバイスすると思われます。

(私はthisに戻って考えているかもしれませんが、その例は4.1.5で問題ないと思われます)My Oracle Supportでは、いずれのバグレポートも表示されません。

+1

4.2.0.17.089.1709にアップグレードして問題が解決しました。最初に2番目の変数に代入することで回避しようとしましたが、問題をその新しい行に移していたために機能しませんでした。しかし、私はどのようにブロックに2つの線を一緒に置くかを見ています。それはおそらくうまくいきましたが、私はそれをしなければならないはずはありませんでした。ありがとう。 –

関連する問題