Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переменные связки / 3 сообщений из 3, страница 1 из 1
14.09.2017, 22:51
    #39521405
cobalt_frog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменные связки
Добрый вечер,

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

Код: plsql
1.
2.
3.
4.
5.
6.
begin
  for i in (select id from t) loop
    update t set n = n + 1 where id = i.id;
  end loop;
  commit;
end;


, а для кейса:
Код: plsql
1.
2.
3.
4.
5.
6.
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;


такого преобразования не происходит?
...
Рейтинг: 0 / 0
15.09.2017, 08:12
    #39521497
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменные связки
cobalt_frogПочемуBy design, тролль.
...
Рейтинг: 0 / 0
15.09.2017, 10:01
    #39521572
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переменные связки
cobalt_frog,

потому что во втором случае ты скармливаешь ему строку. откуда ему знать что там внутри на момент парсинга анонимного блока (в котором находится выражение EXECUTE IMMEDIATE ? - вот и происходит динамический SQL с хард парсом при каждом конкретном значении i.id.
если ты хочешь динамику с биндом, используй силу, Люк:
Код: plsql
1.
execute immediate 'update t set n = n + 1 where id = :id' using i.id;

хотя, не понимаю, зачем тут динамика
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Переменные связки / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]