Портирование процедуры T-SQL, возвращающей несколько результатов, в PostgreSql
Есть проект, в котором используются MSSQL сервер и клиент на C#. Появилась необходимость добавить в проект поддержку PostgreSQL. В клиенте не используется Entity Framework. Связь с MSSQL сервером осуществляется через класс SqlConnection. Я добавил связь с PostgreSQL через OdbcConnection и запросы к таблицам и функциям, возвращающим простой результат, работают. Я споткнулся на портировании в plpgsql процедуры такого вида:
CREATE PROCEDURE [dbo].[Foo]
some parameters
AS
BEGIN
declare @AccountId int
-- get account
select @AccountId = ...
...
-- fetch account
select @AccountId
...
-- additional information
select distinct
t1.a,
t1.b,
...
t2.c,
t2.d,
...
from table1 t1,
table2 t2,
...
where ...
END
Процедура возвращает два результата разного типа - int и таблицу. Клиент читает их так:
int accountId;
using( IDataReader reader = conn.ExecuteReader( query ) )
{
reader.Read();
accountId = reader.GetInt32( 0 );
reader.NextResult();
fwi.AdditionalInformation = new AdditionalInformationCollection( accountId );
fwi.AdditionalInformation.RetrieveByQuery( reader, conn );
}
В plpgsql нужно задать то, что будет возвращать функция при её определении. На сколько я понял, если задать RETURNS SETOF RECORD, то типы результата нужно указать в клиенте при обращении к этой функции select * from foo(...) as (???). Если функцию задать как RETURNS TABLE, то здесь же и нужно указать типы возвращаемых значений.
Можно ли такое реализовать на plpgsql не изменяя T-SQL и клиентскую часть? Или придётся разбивать процедуру на две и в MSSQL и в PostgreSQL?
У меня ещё мало опыта в работе с PostgreSQL.