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

Откуда:
Сообщений: 134
execute block as
declare vN  VARCHAR(250);
begin
  IF (EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = 'T1' AND RDB$FIELD_NAME = 'TXT')) THEN BEGIN
  for select TXT from T1 into :vN do
  ----
  EXECUTE STATEMENT 'ALTER TABLE T1 DROP TXT';
  end
end


Ошибка обращения к T1.TXT при повторном запуске скрипта.

получается for select парсится или выполняется игнорируя результат условия IF ?
IF проверил работает как и ожидается.

FB 2.1.7
13 сен 17, 16:06    [20793192]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
Нет, конечно. Как "проверял", отладчиком?
"Повторном запуске" после коммита или без коммита?

Posted via ActualForum NNTP Server 1.5

13 сен 17, 16:08    [20793203]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43662

Вся процедура парсится и препарируется одновременно. Тут тебе не MS SQL, интерпретирующий
батч по отдельным запросам.

Posted via ActualForum NNTP Server 1.5

13 сен 17, 16:08    [20793207]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
А, он ещё и селектит дропнутое поле...
Да, так нельзя, будет ошибка на препаре.
Решение очевидно, конечно, но кривь.

Posted via ActualForum NNTP Server 1.5

13 сен 17, 16:10    [20793212]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Epox0UA
Member

Откуда:
Сообщений: 134
1. конечно коммит после каждого выполнения.
2. IF проверял, вместо FOR SELECT, вставлял update заведомо существующего поля/записи. В логах: все как должно быть.
3. Задача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля. Вот и я думал что это очевидное решение. Оказалось парсер не пускает такую конструкцию.

Баг/недоработка СУБД?
13 сен 17, 16:21    [20793245]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Epox0UA
Member

Откуда:
Сообщений: 134
Гаджимурадов Рустам
А, он ещё и селектит дропнутое поле...
Да, так нельзя, будет ошибка на препаре.
Решение очевидно, конечно, но кривь.

Вообще-то по логике можно. IF не должен давать зайти внутрь.
п.с. Да, можно, как оказалось парсер MERGE пропускает как и должен.
13 сен 17, 16:25    [20793258]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7287
Epox0UA,

это на уровне архитектуры, EXECUTE BLOCK препарируется как единый statement. Если поля нет, значит ошибка препарирования. Не нравится иди туда где такое можно MS SQL, MySQL.
В Firebird метаданные "на лету" изменять не принято
13 сен 17, 16:27    [20793269]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
pastor
Member

Откуда: Калуга
Сообщений: 884
Epox0UA
1. конечно коммит после каждого выполнения.
2. IF проверял, вместо FOR SELECT, вставлял update заведомо существующего поля/записи. В логах: все как должно быть.
3. Задача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля. Вот и я думал что это очевидное решение. Оказалось парсер не пускает такую конструкцию.

Баг/недоработка СУБД?


1. COMMIT не означает unprepare
3. подмена понятий/смена контекста
если делается через EXECUTE STATEMENT, то и делать надо через него все, в т.ч. UPDATE.

это граната специальной системы :)
13 сен 17, 16:47    [20793341]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
Epox0UA> 3. Задача: одним скриптом вытащить данные
Epox0UA> в таблицу Т2, а в Т1 удалить эти поля.

Стоит задуматься о кривой архитектуре,
ибо DDL и DML (да ещё в зависимости
от DDL) смешивать не принято.

Epox0UA> Оказалось парсер не пускает такую конструкцию.
Epox0UA> Баг/недоработка СУБД?

Не баг и не недоработка, а правила.
В Оракле, к примеру, правила ещё строже.
Нельзя на ходу выкидывать мотор и
возмущаться, что машина не едет дальше.

Posted via ActualForum NNTP Server 1.5

13 сен 17, 17:12    [20793414]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Dmitry Kurbsky
Member

Откуда:
Сообщений: 141
Epox0UA
Задача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля.


Это не задача. Это твой способ решения некой задачи. Если расскажешь про задачу, может быть, здесь подскажут, как решить её без убиения столбцов на лету.
13 сен 17, 18:06    [20793618]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
vvvait
Member

Откуда:
Сообщений: 19
мне гранат не жалко

execute block as
declare vN  VARCHAR(250);
begin
  IF (EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = 'T1' AND RDB$FIELD_NAME = 'TXT')) THEN BEGIN
  for execute statement 'select TXT from T1' into :vN do
  ----
  EXECUTE STATEMENT 'ALTER TABLE T1 DROP TXT';
  end
end
13 сен 17, 19:07    [20793753]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
Нехай все обезьяны подорвутся,
да здравствует естественный отбор?

Posted via ActualForum NNTP Server 1.5

13 сен 17, 19:37    [20793839]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Старый плюшевый мишка
Member

Откуда:
Сообщений: 208
Epox0UA
Баг/недоработка СУБД?


Баг и недоработка. Но не СУБД.
13 сен 17, 20:09    [20793898]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
vvvait
Member

Откуда:
Сообщений: 19
Гаджимурадов Рустам, если это делается один раз, монопольно, для обновления структуры бд, то почему бы и нет
14 сен 17, 12:12    [20795175]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7287
vvvait,

если это делается для обновления структуры БД, то и не фиг EXECUTE BLOCK делать. Пиши нормальный скрипт
14 сен 17, 12:18    [20795200]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
vvvait
Member

Откуда:
Сообщений: 19
Симонов Денис, suum cuique
14 сен 17, 12:20    [20795208]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
vvvait> если это делается один раз

Если делается один раз, то не бывает никаких "повторно".

> монопольно, для обновления структуры бд, то почему бы и нет

Если для обновления структуры, то делается скрипт
(и обычно два отдельных - один на весь DDL, затем
отдельный на DML), а не смешанный EB на 2 строчки.
И обычно обновляя структуры, знают с какой версии
(и структуры БД), а не проверяют (хотя бывает и такое).

Posted via ActualForum NNTP Server 1.5

14 сен 17, 12:38    [20795266]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
pastor
Member

Откуда: Калуга
Сообщений: 884
Гаджимурадов Рустам
vvvait> если это делается один раз

Если делается один раз, то не бывает никаких "повторно".

> монопольно, для обновления структуры бд, то почему бы и нет

Если для обновления структуры, то делается скрипт
(и обычно два отдельных - один на весь DDL, затем
отдельный на DML), а не смешанный EB на 2 строчки.
И обычно обновляя структуры, знают с какой версии
(и структуры БД), а не проверяют (хотя бывает и такое).



обычно, правильно, удобно - три разных сущности

перенос на новую структуру БД у нас делается выполнением нескольких десятков блоков.
в старой БД создаются поля (если их нет), заполняются по правилам, или по дефолту.
что должно быть - берется из новой структуры БД, там же скрипты и правила переноса. и клиентские exe/

потом данные тупо переливаются в новую БД. гарантированно правильной структуры.

в прежней ничего не удаляется. все равно на помойку.

скорость - 2 гб база за 20 мин.
бонусом тождественная структура БД у всех заказчиков, клиентские экзешники в точности соответствуют структуре.

пункт № 0 - бакап.
14 сен 17, 12:47    [20795308]     Ответить | Цитировать Сообщить модератору
 Re: IF и FOR SELECT на удаляемое поле  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 57329
pastor> обычно, правильно, удобно - три разных сущности

Кому и кобыла - невеста, да.

Posted via ActualForum NNTP Server 1.5

14 сен 17, 12:49    [20795315]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить