|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
FB 2.5.9 win10 в теле процедуры вызывается конструкция вида merge into table1 dest using ( SELECT rdb$get_context('USER_TRANSACTION', 'row#') as place, rdb$set_context('USER_TRANSACTION', 'row#', Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) + 1), table1.id FROM table1 ORDER BY table1.id ) src on dest.id=src.id when matching dest.place := src.place. Задача пронумеровать строки в подзапросе и сохранить в таблицу. По факту все выполнилось, но везде записалось 0 Если кто то знает прошу пояснить почему установка переменной не срабатывает в процедурах при этом этот же запрос выполненный отдельно срабатывает нормально. т.е. проставляется ожидаемая нумерация строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 09:37 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
pg2020, ну для начала это не тот запрос что вы пробуете. Он в принципе даже не скомпилируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:03 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
pg2020, а если вместо Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) сделать cast(Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) as integer) ? ругается же вроде вполне внятно ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:09 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Поправил синтаксис. merge into table1 dest using ( SELECT RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW') AS place, RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) AS INTEGER)+1), table1.id FROM table1 ORDER BY table1.id ) src on dest.id=src.id when matching set dest.place := src.place Если кто то знает прошу пояснить почему установка переменной не срабатывает в процедурах при этом этот же запрос выполненный отдельно срабатывает нормально. т.е. проставляется ожидаемая нумерация строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:13 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Не надо исполнять арии Карузо в перепевах Рабиновича. Если "прямщас" нет возможности привести фактическое сообщение об ошибке и оформленный текст запроса (тег src) - надо просто откладывать написание сообщения. Вот прямо "до тех пор, пока не". ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:22 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, Ок, как скажете. Запилил пример чтоб не работало Таблица CREATE TABLE TABLE1 ( ID INTEGER, PLACE INTEGER, NAME VARCHAR(20) ); содержимое ID, PLACE, NAME 1, null, z 2, null, x 3, null, b 4, null, a 5, null, c UPDATE OR INSERT INTO TABLE1 (ID, PLACE, NAME) VALUES (1, NULL, 'z') MATCHING (ID); UPDATE OR INSERT INTO TABLE1 (ID, PLACE, NAME) VALUES (2, NULL, 'x') MATCHING (ID); UPDATE OR INSERT INTO TABLE1 (ID, PLACE, NAME) VALUES (3, NULL, 'b') MATCHING (ID); UPDATE OR INSERT INTO TABLE1 (ID, PLACE, NAME) VALUES (4, NULL, 'a') MATCHING (ID); UPDATE OR INSERT INTO TABLE1 (ID, PLACE, NAME) VALUES (5, NULL, 'c') MATCHING (ID); Запрос который работает если его выполнять отдельно SELECT RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW') AS place, RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) AS INTEGER)+1), table1.id, name FROM table1 ORDER BY table1.name запрос на merge merge into table1 dest using ( SELECT RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW') AS place, RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) AS INTEGER)+1) as x, id , name FROM table1 ORDER BY table1.name ) as src on dest.id = src.id when matched then update set dest.place = src.place; Хм, мердж отдельно тоже не работает :( ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:43 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:49 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
А если добавить поле то начинает работать CREATE TABLE TABLE1 ( ID INTEGER, PLACE INTEGER, NAME VARCHAR(20), XX INTEGER ); запрос merge into table1 dest using ( SELECT 1 + CAST(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) as INTEGER) AS place, RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) AS INTEGER)+1) as x, id , name FROM table1 ORDER BY table1.name ) as src on dest.id = src.id when matched then update set dest.place = src.place, dest.xx=src.x; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:55 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 10:56 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
pg2020, вычисляемые поля, которые не используются, не вычисляются. Вот если бы x, использовался в set, то всё бы работало ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:03 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, 3й ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:04 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
merge into table1 dest using ( SELECT 1 + CAST(coalesce(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) as INTEGER) AS pl, RDB$SET_CONTEXT('USER_TRANSACTION', 'ROW', CAST(COALESCE(RDB$GET_CONTEXT('USER_TRANSACTION', 'ROW'), 0) AS INTEGER)+1) as x, id bb, name FROM table1 ORDER BY table1.name asc ) as src on dest.id = src.bb when matched then update set dest.place = src.pl, dest.xx=src.x, dest.yy = src.bb; приводит к ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:06 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Как видно нумерация идет неверная. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:13 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
pg2020, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:15 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Симонов Денис, Да, так работает но см. скрин выше , нумерация не в том порядке. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:22 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
pg2020, у тебя 2 варианта. 1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную 2. перейти на 3.0 и использовать нормальные оконные функции Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что в SQL порядок вычисления выражений в нём в общем случае не определён. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:25 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Симонов Денис pg2020, у тебя 2 варианта. 1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную 2. перейти на 3.0 и использовать нормальные оконные функции Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что SQL и порядок вычисления выражений в нём в общем случае не определён. В моем случае наверно вариант 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:34 |
|
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
|
|||
---|---|---|---|
#18+
Симонов Денис pg2020, у тебя 2 варианта. 1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную 2. перейти на 3.0 и использовать нормальные оконные функции Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что SQL язык декларативный и порядок вычисления выражений в нём в общем случае не определён. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2020, 11:36 |
|
|
start [/forum/topic.php?fid=40&fpage=10&tid=1560178]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
289ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 237ms |
total: | 628ms |
0 / 0 |