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

Код: 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
01.03.2015, 16:40
    #38891769
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE OR INSERT в EXECUTE BLOCK
IBExpert,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ошибку увидишь когда переборщишь. В 4.0 также собираются ввести batch api. Так что execute block со 100500 однотипными операторами должны уйти в прошлое.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.07.2019, 11:16
    #39842873
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE OR INSERT в EXECUTE BLOCK
Ну так и какое решение проблемы? Вставлять commit work каждые N записей в блоке?
...
Рейтинг: 0 / 0
30.07.2019, 16:22
    #39843068
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE OR INSERT в EXECUTE BLOCK
не помогло, пришлось разделять на несколько файлов
...
Рейтинг: 0 / 0
30.07.2019, 16:46
    #39843086
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UPDATE OR INSERT в EXECUTE BLOCK
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UPDATE OR INSERT в EXECUTE BLOCK / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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