SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Cursor stability. как его обойти
Cursor stability. как его обойти [сообщение #3976] Thu, 28 December 2023 16:47 Переход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: 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. как его обойти [сообщение #3977 является ответом на сообщение #3976] Thu, 28 December 2023 17:18 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
не помогает Sad

идея была полностью зафетчить все из курсора и джойнить с результатом

with S ( ID_SP, ID_OUT)
as (
select sp.ID_SP, sp.ID_OUT
from TEST_SP( :ID_IN ) sp
group by 1, 2
order by 2, 1
)
select s.*, t.*
from  S
left join  TEST t on t.ID_SP = s.ID_SP and t.id = s.ID_OUT

Re: Cursor stability. как его обойти [сообщение #3979 является ответом на сообщение #3976] Thu, 28 December 2023 17:52 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 364
Зарегистрирован: August 2022
Senior Member
Попробуй
for select ... from sp_test()
  into ...
  do begin
    select ... from test where ... into...
    suspend;
  end
PS Не проверял
Re: Cursor stability. как его обойти [сообщение #3980 является ответом на сообщение #3977] Thu, 28 December 2023 17:55 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: 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. как его обойти [сообщение #3982 является ответом на сообщение #3980] Fri, 29 December 2023 01:41 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 417
Зарегистрирован: August 2022
Senior Member
А сразу готовый результат вставки вернуть из функции совсем никак?..
Re: Cursor stability. как его обойти [сообщение #3983 является ответом на сообщение #3982] Fri, 29 December 2023 02:59 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время в онлайне  shavluk
Сообщений: 82
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
Я у себя в подобной ситуации изменил процедуру, она у меня возвращает все необходимые значения, без дополнительных join

[Обновления: Fri, 29 December 2023 03:00]

Известить модератора

Re: Cursor stability. как его обойти [сообщение #3984 является ответом на сообщение #3982] Fri, 29 December 2023 08:38 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
SD писал(а) Fri, 29 December 2023 01:41
А сразу готовый результат вставки вернуть из функции совсем никак?..
Цитата:
нудных вариантов обхода - в достатке.
Re: Cursor stability. как его обойти [сообщение #3985 является ответом на сообщение #3979] Fri, 29 December 2023 09:18 Переход к предыдущему сообщениюПереход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: 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 в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: 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
^
дают разные, удивительные результаты Smile
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
Предыдущая тема: UDR библиотека для работы с регулярными выражениями
Следующая тема: Поломка базы. Нужна помощь
Переход к форуму:
  


Текущее время: Sun Dec 22 18:10:51 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01257 секунд