Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Переменные связки  [new]
cobalt_frog
Member

Откуда: Железные острова
Сообщений: 180
Добрый вечер,

Почему PL/SQL преобразует свои переменные в переменные связки для кейса:

begin
  for i in (select id from t) loop
    update t set n = n + 1 where id = i.id;
  end loop;
  commit;
end;

, а для кейса:
begin
  for i in (select id from t) loop
    execute immediate 'update t set n = n + 1 where id = '||i.id;
  end loop;
  commit;
end;

такого преобразования не происходит?
14 сен 17, 22:51    [20797434]     Ответить | Цитировать Сообщить модератору
 Re: Переменные связки  [new]
Elic
Member

Откуда:
Сообщений: 29988
cobalt_frog
Почему
By design, тролль.
15 сен 17, 08:12    [20797665]     Ответить | Цитировать Сообщить модератору
 Re: Переменные связки  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
cobalt_frog,

потому что во втором случае ты скармливаешь ему строку. откуда ему знать что там внутри на момент парсинга анонимного блока (в котором находится выражение EXECUTE IMMEDIATE ? - вот и происходит динамический SQL с хард парсом при каждом конкретном значении i.id.
если ты хочешь динамику с биндом, используй силу, Люк:
execute immediate 'update t set n = n + 1 where id = :id' using i.id;
хотя, не понимаю, зачем тут динамика
15 сен 17, 10:01    [20797880]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить