Начало » Использование СУБД » Firebird, HQbird, InterBase » Cursor stability. как его обойти
Cursor stability. как его обойти [сообщение #3976] |
Thu, 28 December 2023 16:47 |
pastor
Сообщений: 81 Зарегистрирован: June 2022 Географическое положение: Калуга
|
Member |
|
|
Переползаем потихоньку с 2.5 на 5.0
в 2.5 TEST_SP возвращала результат, начиная с 3.0 - нет.
почему так - я прекрасно понимаю.
нудных вариантов обхода - в достатке.
вопрос: есть ли возможность указать план запроса (SORT или еще что), чтобы полностью отфетчилась процедура, а результыты ее выполнения сджойнились с модифицируемой таблицей данных.
set term ^ ;
create table TEST(
ID bigint,
ID_SP bigint,
primary key (ID)
)
^
create procedure TEST_SP(
ID_IN bigint
) returns (
ID_SP bigint,
ID_OUT bigint
) as
begin
insert into TEST(ID, ID_SP) values (:ID_IN, :ID_IN);
ID_SP = :ID_IN;
ID_OUT = :ID_OUT;
suspend;
end
^
select sp.ID_SP, t.ID
from TEST_SP( 1) sp
left join TEST t on t.ID_SP = sp.ID_SP
^
|
|
|
|
|
Re: Cursor stability. как его обойти [сообщение #3980 является ответом на сообщение #3977] |
Thu, 28 December 2023 17:55 |
sim_84
Сообщений: 330 Зарегистрирован: June 2022
|
Senior Member |
|
|
Ещё раз повторю именно этот пример не имеет смысла. Предлагаю посложнее
execute block
as
procedure inserts(y int)
returns (a int, b int)
as
begin
for
select x
from t
into a
do
begin
if (a > y) then
begin
insert into t2(a)
values (:a)
returning b
into b;
suspend;
end
end
end
begin
for
select
t2.c
from
inserts(5) i
left join t2 on t2.b = i.b
do
begin
-- тута обработка. Нужна узнать что вставилось
end
end
[Обновления: Thu, 28 December 2023 17:56] Известить модератора
|
|
|
|
|
|
Re: Cursor stability. как его обойти [сообщение #3985 является ответом на сообщение #3979] |
Fri, 29 December 2023 09:18 |
pastor
Сообщений: 81 Зарегистрирован: June 2022 Географическое положение: Калуга
|
Member |
|
|
спасибо, сработало!
execute block
(ID_IN bigint = :ID_IN)
returns (
ID_SP bigint,
ID_OUT bigint
) as
begin
id_out = null;
for select sp.ID_SP
from TEST_SP( :ID_IN ) sp
into :ID_SP
do for select t.ID
from TEST t
where t.ID_SP = :ID_SP
into :ID_OUT
do suspend;
end
[Обновления: Fri, 29 December 2023 10:24] Известить модератора
|
|
|
Re: Cursor stability. как его обойти [сообщение #3987 является ответом на сообщение #3985] |
Fri, 29 December 2023 12:23 |
pastor
Сообщений: 81 Зарегистрирован: June 2022 Географическое положение: Калуга
|
Member |
|
|
несколько модифицировал
set term ^ ;
create table TEST(
ID bigint,
ID_SP bigint,
primary key (ID)
)
^
create or alter procedure TEST_SP(
ID_IN bigint
) returns (
ID_SP bigint,
ID_OUT bigint
) as
declare variable i integer;
begin
i = 0;
while (i < 3)
do begin
insert into TEST(ID, ID_SP) values (:ID_IN, :ID_IN);
ID_SP = :ID_IN; ID_OUT = :ID_IN;
suspend;
ID_IN = ID_IN + 1;
i = i + 1;
end
end
^
дают разные, удивительные результаты
with S ( ID_SP, ID_OUT)
as (
select first 100 sp.ID_SP, sp.ID_OUT
from TEST_SP( :ID_IN ) sp
order by 1 desc, 2 desc
)
select first 100 s.*, t.*
from S
left join TEST t on t.ID_SP = s.ID_SP and t.id = s.ID_SP
order by s.ID_SP
with S ( ID_SP, ID_OUT)
as (
select sp.ID_SP, sp.ID_OUT
from TEST_SP( :ID_IN ) sp
order by 'const')
select s.*, t.*
from S
left join TEST t on t.ID_SP = s.ID_SP and t.id = s.ID_SP
|
|
|
Переход к форуму:
Текущее время: Fri Nov 22 01:58:43 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00879 секунд
|