2016-10-20 30 views
-2
variable deptno number ; 
      deptno1 number;  
+3

です。宣言の点で違いはありません。それはあなたがそれを使う方法です。 PL/SQLブロック内の静的SQL文で参照されるすべてのPl/SQL変数はバインド変数です。動的SQL(ネイティブ動的SQL、例えば 'execute immediate')の場合は、変数の値を変更するたびにSQLエンジンがステートメントをハード解析することを避けるために' using'節を使用して変数をバインドします。 –

答えて

-2

主な違いはパフォーマンスにあります。バインド変数を使用すると、一度クエリを解析し、別の値でクエリを実行するたびに将来の解析を保存できます。 通常の変数を使用すると、変数の値が変更されるたびにハード・パースが実行されます。

+1

それはまったく真実ではありません。 'update table1 set col1 = v_col1; 'のような文は、v_col1の値が変わるたびにハード解析を引き起こさない。それはバインド変数として扱われるからです。 'execute immediate 'update table1 set col1 =' || v_col1;'を実行すると、値がハードコードされているステートメントをデータベースに強制的に実行させます。つまり、v_col1の場合は 'update table1 set col1 = 101' = 101、 'u​​pdate table1 set col1 = 102'ならばv_col1 = 102などです。私はあなたが2つの概念を混乱させてしまったと思います。 – Boneist

0

あなたの質問は本当にわかりません...しかし、私は、次の回答/ポスト(Alex Pooleから)は、SQL/PL-SQLで変数を定義する方法と方法を明確にしてください。

Declare bind variables in SQL*Plus

は、我々は両方の方法でそれら「バインド」にしようとすると、リテラルを避けます。

0

バインド変数は、SQLと呼び出し側アプリケーションまたはホスト言語の間のインタフェースの一部です。したがって、SQL文で単純変数を使用しないとバインド変数になりません。

declare 
    msg varchar2(100) := 'Hello'; 
begin 
    dbms_output.put_line(msg); 
end; 

実際のバインド変数の場合、これはどのような方法でも同じです。 PL/SQLコンパイラは、あなたのためにコードを作成します。 SQLは、それが実際に実行さ

var dummy varchar2(1) 

exec :dummy := 'X' 

declare 
    l_result integer; 
begin 
    select count(*) into l_result from dual where dummy = :dummy; 
    dbms_output.put_line(l_result); 
end; 

あなたは五$ SQLから表示されますいずれかの方法で、DBMS_XPLANなど:

平野PL/SQL:明示的にSQL * Plusで定義された

declare 
    l_dummy varchar2(1) := 'X'; 
    l_result integer; 
begin 
    select count(*) into l_result from dual where dummy = l_dummy; 
    dbms_output.put_line(l_result); 
end; 

バインド変数は、は

SELECT COUNT(*) FROM DUAL WHERE DUMMY = :B1 
関連する問題