2016-03-28 10 views
1

私はexpert-oracle-database-architectureの本を読んでいます。このTomでは、バインド変数について説明しています。なぜ即時実行がここで使用されますか?

最初の手順と2番目の手順が異なる方法を教えてください。 私の理解によれば、動的SQL文または匿名PL/SQLブロックを実行するのにexecute immediateを使用します。ここで

は、ターゲット表です:

create table t (x int); 

ここで例の手順#1:

ops$tkyte%ORA11GR2> create or replace procedure proc_name1 
2 as 
3 begin 
4 for i in 1 .. 10 
5  loop 
6  execute immediate 
7   'insert into t values ('||i||')'; 
8 end loop; 
9 end; 
10/

ここで例の手順#2:

create or replace procedure proc_name2 
as 
begin 
    for i in 1 .. 10 
    loop 
    insert into t values (i); 
    end loop; 
end; 
+1

それはしないことの例です – Sathya

+0

書かれている方法を除いて、違いはありません。即時実行を使用して良いパフォーマンスがありますか? – Wolfgang

+1

これは、 'execute immediate'ステートメントの(ab)使用です。また、厳密に言えば、その単純な挿入の手順は必要ありません。純粋なSQLで簡単に行うことができます。 –

答えて

5

「ウィルが即時実行を使用して良いパフォーマンスが得られますか?」

EXECUTE IMMEDIATEは行うべきではありません。動的ではない例のすべてを実行するだけでなく、ループの繰り返しごとにステートメントをハード解析するオーバーヘッドがあるため、そのパフォーマンスは悪化します。

トムが作成している点は、経験の浅い開発者が、必要でないときにEXECUTE IMMEDIATE(または他の形式の動的SQL)を使用することが多いことです。動的SQLは悪いニュースです。パフォーマンスへの影響のほかに:依存関係がに表示されませんので、

  • 静的SQLよりも書くことが困難である
  • 構文エラーがランタイム例外ではないコンパイルエラーがある
  • 維持することが困難である(影響分析は、注意が必要ですデータ・ディクショナリ・ビュー)。
関連する問題