Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IF и FOR SELECT на удаляемое поле / 19 сообщений из 19, страница 1 из 1
13.09.2017, 16:06
    #39520542
Epox0UA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
13.09.2017, 16:08
    #39520547
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Нет, конечно. Как "проверял", отладчиком?
"Повторном запуске" после коммита или без коммита?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 16:08
    #39520549
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Вся процедура парсится и препарируется одновременно. Тут тебе не MS SQL, интерпретирующий
батч по отдельным запросам.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 16:10
    #39520551
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
А, он ещё и селектит дропнутое поле...
Да, так нельзя, будет ошибка на препаре.
Решение очевидно, конечно, но кривь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 16:21
    #39520553
Epox0UA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
1. конечно коммит после каждого выполнения.
2. IF проверял, вместо FOR SELECT, вставлял update заведомо существующего поля/записи. В логах: все как должно быть.
3. Задача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля. Вот и я думал что это очевидное решение. Оказалось парсер не пускает такую конструкцию.

Баг/недоработка СУБД?
...
Рейтинг: 0 / 0
13.09.2017, 16:25
    #39520557
Epox0UA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Гаджимурадов РустамА, он ещё и селектит дропнутое поле...
Да, так нельзя, будет ошибка на препаре.
Решение очевидно, конечно, но кривь.

Вообще-то по логике можно. IF не должен давать зайти внутрь.
п.с. Да, можно, как оказалось парсер MERGE пропускает как и должен.
...
Рейтинг: 0 / 0
13.09.2017, 16:27
    #39520561
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Epox0UA,

это на уровне архитектуры, EXECUTE BLOCK препарируется как единый statement. Если поля нет, значит ошибка препарирования. Не нравится иди туда где такое можно MS SQL, MySQL.
В Firebird метаданные "на лету" изменять не принято
...
Рейтинг: 0 / 0
13.09.2017, 16:47
    #39520579
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Epox0UA1. конечно коммит после каждого выполнения.
2. IF проверял, вместо FOR SELECT, вставлял update заведомо существующего поля/записи. В логах: все как должно быть.
3. Задача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля. Вот и я думал что это очевидное решение. Оказалось парсер не пускает такую конструкцию.

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

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

это граната специальной системы :)
...
Рейтинг: 0 / 0
13.09.2017, 17:12
    #39520596
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Epox0UA> 3. Задача: одним скриптом вытащить данные
Epox0UA> в таблицу Т2, а в Т1 удалить эти поля.

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

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

Не баг и не недоработка, а правила.
В Оракле, к примеру, правила ещё строже.
Нельзя на ходу выкидывать мотор и
возмущаться, что машина не едет дальше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 18:06
    #39520654
Dmitry Kurbsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Epox0UAЗадача: одним скриптом вытащить данные в таблицу Т2, а в Т1 удалить эти поля.

Это не задача. Это твой способ решения некой задачи. Если расскажешь про задачу, может быть, здесь подскажут, как решить её без убиения столбцов на лету.
...
Рейтинг: 0 / 0
13.09.2017, 19:07
    #39520693
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
мне гранат не жалко

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
13.09.2017, 19:37
    #39520705
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Нехай все обезьяны подорвутся,
да здравствует естественный отбор?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.09.2017, 20:09
    #39520717
Старый плюшевый мишка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Epox0UAБаг/недоработка СУБД?

Баг и недоработка. Но не СУБД.
...
Рейтинг: 0 / 0
14.09.2017, 12:12
    #39521017
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Гаджимурадов Рустам, если это делается один раз, монопольно, для обновления структуры бд, то почему бы и нет
...
Рейтинг: 0 / 0
14.09.2017, 12:18
    #39521024
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
vvvait,

если это делается для обновления структуры БД, то и не фиг EXECUTE BLOCK делать. Пиши нормальный скрипт
...
Рейтинг: 0 / 0
14.09.2017, 12:20
    #39521027
vvvait
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Симонов Денис, suum cuique
...
Рейтинг: 0 / 0
14.09.2017, 12:38
    #39521039
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
vvvait> если это делается один раз

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

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

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.09.2017, 12:47
    #39521051
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
Гаджимурадов Рустамvvvait> если это делается один раз

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

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

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



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

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

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

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

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

пункт № 0 - бакап.
...
Рейтинг: 0 / 0
14.09.2017, 12:49
    #39521053
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IF и FOR SELECT на удаляемое поле
pastor> обычно, правильно, удобно - три разных сущности

Кому и кобыла - невеста, да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / IF и FOR SELECT на удаляемое поле / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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