powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UPDATE OR INSERT в EXECUTE BLOCK
24 сообщений из 24, страница 1 из 1
UPDATE OR INSERT в EXECUTE BLOCK
    #38891766
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть скрипт:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute block
as
begin
   update or insert into mytable ...;
   update or insert into mytable ...;
   ...
end;

commit;

execute block
as
begin
   update or insert into mytable ...;
   update or insert into mytable ...;
   ...
end;

commit;

...



Таблица mytable на момент начала выполнения скрипта пустая, на ней висит триггер для генерации ПК. Больше ничего нет.
Все вставляемые записи имеют уникальное значение ПК, т.е. апдейтов заведомо нет, только инсерты.
При попытке выполнения этого скрипта первый блок выполняется без проблем, а вот выполнение второго приводит к ошибке:

Код: plaintext
1.
2.
3.
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
Dynamic SQL Error.
Too many Contexts of Relation/Procedure/Views. Maximum allowed is 255.

При замене UPDATE OR INSERT на просто INSERT никаких проблем нет: скрипт выполняется без ошибок.
Если сократить количество операторов в блоке до 50, например, - проблем тоже нет.

Собственно, вопросов два:
1. Это нормально?
2. Если это нормально, то как определить, сколько операторов можно запихать в блок?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38891769
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

очень странно. Вообще при выполнении execute block в редакторе скриптов обычно переключают разделитель с помощью SET TERM.
Количество контекстов с каждом следующем операторе EB должно сбрасываться
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38891775
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВообще при выполнении execute block в редакторе скриптов обычно переключают разделитель с помощью SET TERM.

В эксперте это необязательно.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38891778
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не могу объяснить почему эта ошибка вылетает при обработке второго EB.
Что насчёт UPDATE OR INSERT, то в этом случае каждый оператор отжирает как минимум 2 контекста, тогда как обычный INSERT один.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38891786
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertПри попытке выполнения этого скрипта первый блок выполняется без проблем, а вот выполнение второго приводит к ошибке:Так чем блоки-то отличаются ?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38891790
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladIBExpertПри попытке выполнения этого скрипта первый блок выполняется без проблем, а вот выполнение второго приводит к ошибке:Так чем блоки-то отличаются ?

Только данными самих записей, больше ничем.
Если по 50 операторов в блок паковать, то все ОК: все 200 блоков (10000 записей) выполняются без проблем.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38892064
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, я наврал вчера. Не выполняется уже первый блок, если количество операторов в нем больше 85.
Получается, в блок можно упаковать не больше 85 UPDATE OR INSERT.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38892069
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertКажется, я наврал вчера. Не выполняется уже первый блок, если количество операторов в нем больше 85.
Получается, в блок можно упаковать не больше 85 UPDATE OR INSERT.
все ждали, когда же ты признаешься :-) 256/3 = 85, однако.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38893073
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrвсе ждали, когда же ты признаешься :-) 256/3 = 85, однако.
И что это значит?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #38893104
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exteris,

что есть лимит в 256 контекстов на запрос и что UPDATE OR INSERT использует три контекста
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UPDATE OR INSERT в EXECUTE BLOCK
    #39277689
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему...
Опять возникли вопросы с too many contexts. При некоторых условиях (у меня не воспроизводится, жалуются пользователи) казалось бы корректные блоки вызывают упомянутую ошибку. Юзер прислал тексты двух блоков. В одном 227 апдейтов + 2 инсерта. В другом 168 апдейтов. Апдейты обыкновенные, без OR INSERT и селектов в них. Firebird 2.5, точную версию могу уточнить.

Собственно, вопрос: для подобных блоков (последовательность INSERT/UPDATE) можно ли заранее закладываться на то, что на каждый запрос потребуется ровно один контекст, или же при каких-то условиях контекстов может понадобиться больше?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277728
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

апдейт всегда требовал 2 контекста - NEW и OLD
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277758
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladапдейт всегда требовал 2 контекста - NEW и OLD

Спасибо! Теперь все понятно.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277836
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrчто есть лимит в 256 контекстов на запрос и что UPDATE OR INSERT использует три контекста

интересно, а почему так ?

казалось бы UPDATE-NEW и INSERT по сути один контекст, который можно использовать независимо от того, по какой причине вызван триггер?

и до кучи, update or insert or delete будет использовать 4 контекста?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277841
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochпо какой причине вызван триггер?

вернее - по какой ветке пошло исполнение команды

[/quot] и до кучи, update or insert or delete будет использовать 4 контекста?[/quot]

это не читать, это меня уже переклинило
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277848
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем....

MERGE в тройке умеет и добавлять, и изменять, и удалять записи.
MERGE в тройке может содержать НЕСКОЛЬКО update-команд

тогда сколько же контекстов съедает MERGE ?

можно ли получить количество потребных контекстов как результат prepare statement ?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39277862
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochтогда сколько же контекстов съедает MERGE ?

Может съесть сколько угодно вплоть до 255 даже в 2.5, т.к. запрос в USING может быть произвольной сложности.

Ariochможно ли получить количество потребных контекстов как результат prepare statement ?

Забей. В 4.0 вроде как лимит на количество контекстов будут увеличивать многократно.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39278034
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой-бы лимит ни был, а он фиксированный

так что для автогенераторов скриптов возможность отслеживать "сколько я уже контекстов потратил" и "не пора ли передёнуть" - был бы полезен IMHO
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39278040
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

если он будет двухбайтовый, то это будет 65535. Я сомневаюсь, что ты такой длины запрос напишешь.
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39278046
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см. первый пост в этой ветке

и заметь, что я упомянул автогенераторы скриптов

одним только апдейтом ( точнее одними апдейтами, повторёнными сколько надо) умудрились исчерпать контекст

в общем, бутылочное горлышко есть, даже и 65K - тоже ограничение.
а предупреждения о подходе к нему - нет
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39278052
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ошибку увидишь когда переборщишь. В 4.0 также собираются ввести batch api. Так что execute block со 100500 однотипными операторами должны уйти в прошлое.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
UPDATE OR INSERT в EXECUTE BLOCK
    #39842873
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так и какое решение проблемы? Вставлять commit work каждые N записей в блоке?
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39843068
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не помогло, пришлось разделять на несколько файлов
...
Рейтинг: 0 / 0
UPDATE OR INSERT в EXECUTE BLOCK
    #39843086
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11, всегда пользовал такую конструкцию:
Код: plsql
1.
2.
3.
4.
INSERT INTO table_name (field1, field2, ...)
        SELECT value1, value2, ... FROM oneRow
  UNION SELECT value1, value2, ... FROM oneRow
  . . .


Где oneRow :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SET TERM ^;
CREATE OR ALTER PROCEDURE oneRow
  RETURNS (tmstmp TIMESTAMP)
AS
BEGIN
  tmstmp = CURRENT_TIMESTAMP;
  SUSPEND;
END^
SET TERM ;^
GRANT EXECUTE ON PROCEDURE oneRow TO PUBLIC;
COMMIT WORK;
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UPDATE OR INSERT в EXECUTE BLOCK
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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