PostgreSQL возвращает прекурсоры SetOf в ADODB через psqlodbc: чтение нескольких таблиц за один раз - PullRequest
0 голосов
/ 25 сентября 2019

Мой вопрос касается оптимизированного чтения из базы данных Postgres в клиент ADODB (VBA, Visual Basic 6) с использованием драйверов psqlodbc.Часто разработчики хотят получать данные из нескольких таблиц (имеющих разные поля) в одном сетевом вызове, чтобы, возможно, минимизировать циклические переходы между клиентом и сервером.Не все знают, но Postgres / psqlodbc возвращает несколько результирующих наборов, если мы просто разделяем наши select точкой с запятой.Затем наборы результатов могут быть сопоставлены с наборами записей Adodb с помощью свойства NextRecordset :

Set rs = cn.Execute("select * from tableA;select * from tableB;select * from tableC;")
Set rsA = rs
Set rsB = rs.NextRecordset
Set rsC = rs.NextRecordset

Однако, если вы хотите использовать функцию plpgsql для обработки и упаковки ваших данных, существует каменная стена.: вам нужно указать каждое возвращаемое поле вместе с его типом, поэтому, очевидно, вы не сможете получить результаты множественного выбора таким образом.Кажется, вы можете использовать refcursors:

CREATE or replace FUNCTION get_data()
RETURNS setof refcursor AS $$
DECLARE
    a refcursor;
    b refcursor;
BEGIN

    open a FOR select * tableA; RETURN next a;
    open b FOR select * tableB; RETURN next b;
END; $$ LANGUAGE plpgsql;

Было бы замечательно, если бы мы могли просто позвонить select * from get_data() и получить те же результаты, что и выше.Но этот вызов возвращает только имена так называемых порталов, ведущих к рефкурсорам.Есть ли способ, предпочтительно общий, обернуть функцию get_data и получить фактические данные от нескольких рефкурсоров, собранных вместе, как в примере с несколькими операторами, чтобы результаты могли обрабатываться с помощью одного и того же кода VBA (с использованием NextRecordset)?

Может быть, @Erwin Brandstetter может посоветовать?

...