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

Начало » Использование СУБД » Firebird, HQbird, InterBase » UDR selective procedure - not empty result set
UDR selective procedure - not empty result set [сообщение #495] Tue, 06 September 2022 16:18 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Реализую UDR селективную процедуру на Delphi. Как пример беру pdf статью Дениса Симонова "Написание UDR Firebird на Pascal", спасибо ему. Для иллюстрации топика хорошо подходит приведенная там процедура gen_rows.

Заметил следующее: если результирующий набор должен быть пустым, и это по идее должно случиться, когда TGenRowsProcedure.open возвращает nil в качестве result set, на самом деле Firebird возвращает 1 запись, заполненную null'ами, row_count = 1.

create function test_empty_gen_rows
returns
    bigint
as
    declare variable n integer;
begin
    select
        n
      from
        gen_rows( null, null )
      into
        :n
    ;
    return row_count;
end

Result = 1
По-моему, это ошибочное поведение, нет?

Firebird 4.0.2.2816(64), Windows
Re: UDR selective procedure - not empty result set [сообщение #496 является ответом на сообщение #495] Tue, 06 September 2022 16:35 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
ты не торопись с выводами. Если процедура должна возвращать ResultSet, то она обязана его создавать.
Чтобы он был пустым надо чтобы метод TGenRowsResultSet.fetch всегда возвращал false.

А вот когда TGenRowsResultSet остаётся nil, то процедура считается выполняемой (то есть как будто в ней нет SUSPEND)
Re: UDR selective procedure - not empty result set [сообщение #497 является ответом на сообщение #496] Tue, 06 September 2022 17:09 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Tue, 06 September 2022 16:35
Если процедура должна возвращать ResultSet, то она обязана его создавать.
Дык я смотрю в ваш (твой?) пример:
function TGenRowsProcedure.open(AStatus: IStatus; AContext: IExternalContext; AInMsg, AOutMsg: Pointer): IExternalResultSet;
begin
    // если один из входных аргументов NULL ничего не возвращаем
    if PInput(AInMsg).startNull or PInput(AInMsg).finishNull then
    begin
        POutput(AOutMsg).nNull := True;
        Result := nil;
        exit;
    end;
    ...
end;    
Получается, если один из параметров null, процедура превращается выполняемую, но при вызове её в качестве селективной возвращает непустой набор? Странно это как-то. Значит, пример дает неправильную технику?
Re: UDR selective procedure - not empty result set [сообщение #498 является ответом на сообщение #497] Tue, 06 September 2022 17:21 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Переделал логику на управление составом result set только через fetch. Теперь все работает как должно, спасибо. Но пример, ИМХО, неудачный.
Re: UDR selective procedure - not empty result set [сообщение #511 является ответом на сообщение #498] Wed, 07 September 2022 09:28 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Скажем так эта статья и примеры писались мной по мотивам самостоятельного исследования темы UDR. Никакой информации как оно реально работает на тот момент просто не было, кроме 4-х примеров от разработчиков.
Да и у меня опыт написания собственных UDR тогда был нулевой.

Сейчас после того как я написал порядка 10 UDR библиотек мои знания существенно расширились.
Статья и примеры в ней требуют переосмысливания. Как найду время перепишу статью и поправлю примеры
Re: UDR selective procedure - not empty result set [сообщение #533 является ответом на сообщение #511] Thu, 08 September 2022 13:39 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Да я не в претензии. Просто заметил странное явление, доложил. Без Вашей документации разобраться во многих вещах было бы вообще нереально, спасибо огромное! Это и про UDR, и описание языка, и другие статьи. Низкий поклон.
Предыдущая тема: логгирование работы
Следующая тема: клиент ФБ 4.0.1
Переход к форуму:
  


Текущее время: Sun Nov 24 11:17:28 GMT+3 2024

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