Мой вопрос касается оптимизированного чтения из базы данных 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 может посоветовать?