2016-03-28 2 views
1

Я читаю книгу о архитектуре-оракуле-базе данных. В этом Том объясняет переменные Bind.Зачем использовать немедленное действие здесь?

Не могли бы вы рассказать мне, как первая процедура отличается от второй процедуры? В соответствии с моим пониманием мы используем execute immediate для выполнения динамического оператора SQL или анонимного блока PL/SQL.

Вот целевая таблица:

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

Это (ab) использование оператора 'execute direct'. Кроме того, строго говоря, нет необходимости в процедуре для этой простой вставки вообще, вы могли бы просто сделать это в чистом SQL. –

ответ

5

«Будет ли быть любой хорошей производительностью, используя немедленное выполнение? »

EXECUTE IMMEDIATE - это то, что не нужно делать. Его производительность будет хуже, потому что она делает все, что нединамический пример, плюс есть накладные расходы на сильное разборе оператора для каждой итерации цикла.

То, что Том делает, неопытные разработчики часто используют EXECUTE IMMEDIATE (или другие формы динамического SQL), когда им это не нужно. Динамический SQL - это плохая новость. Кроме того, влияние на производительность:

  • это труднее писать, чем статический SQL
  • ошибок синтаксиса во время выполнения исключения не ошибки компиляции
  • это труднее поддерживать (анализ воздействия является сложным, поскольку зависимости не появляются в представления словаря данных).
Смежные вопросы