powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
18 сообщений из 18, страница 1 из 1
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023843
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

Если кто то знает прошу пояснить почему установка переменной не срабатывает в процедурах при этом этот же запрос выполненный отдельно срабатывает нормально. т.е. проставляется ожидаемая нумерация строк.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023847
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg2020,

ну для начала это не тот запрос что вы пробуете. Он в принципе даже не скомпилируется.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023848
a7exander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg2020,

а если вместо

Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0)

сделать

cast(Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) as integer)

?

ругается же вроде вполне внятно
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023849
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправил синтаксис.

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

Если кто то знает прошу пояснить почему установка переменной не срабатывает в процедурах при этом этот же запрос выполненный отдельно срабатывает нормально. т.е. проставляется ожидаемая нумерация строк.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023854
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо исполнять арии Карузо в перепевах Рабиновича.
Если "прямщас" нет возможности привести фактическое сообщение об ошибке и оформленный текст запроса (тег src) - надо просто откладывать написание сообщения. Вот прямо "до тех пор, пока не".
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023857
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;

Хм, мердж отдельно тоже не работает :(
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023858
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023860
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если добавить поле то начинает работать

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;
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023861
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023864
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg2020,

вычисляемые поля, которые не используются, не вычисляются. Вот если бы x, использовался в set, то всё бы работало
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023865
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023866
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;

приводит к
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023869
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как видно нумерация идет неверная.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023870
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg2020,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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 + IIF(src.x > 1, 0, src.x), dest.yy = src.bb;
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023874
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Да, так работает но см. скрин выше , нумерация не в том порядке.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023875
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pg2020,

у тебя 2 варианта.

1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную
2. перейти на 3.0 и использовать нормальные оконные функции

Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что в SQL порядок вычисления выражений в нём в общем случае не определён.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023881
pg2020
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
pg2020,

у тебя 2 варианта.

1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную
2. перейти на 3.0 и использовать нормальные оконные функции

Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что SQL и порядок вычисления выражений в нём в общем случае не определён.


В моем случае наверно вариант 1.
...
Рейтинг: 0 / 0
Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
    #40023882
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
pg2020,

у тебя 2 варианта.

1. Забить на merge и использовать for select .. do update с нумерацией через обычную переменную
2. перейти на 3.0 и использовать нормальные оконные функции

Использование rdb$set_context в select запросе это грязный хак, который непредсказуемо работает. Вообще надо запомнить, что SQL язык декларативный и порядок вычисления выражений в нём в общем случае не определён.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Не срабатывает RDB$GET_CONTEXT \ RDB$SET_CONTEXT в процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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