У меня есть эта функция PostgreSQL PL / pgSQL:
CREATE OR REPLACE FUNCTION get_people()
RETURNS SETOF people AS $$
BEGIN
RETURN QUERY SELECT * FROM people;
END;
$$ LANGUAGE plpgsql;
Затем я пытаюсь прочитать данные в приложении, используя SOCI, с помощью этого кода:
session sql {"postgresql://dbname=postgres"};
row person {};
procedure proc = (sql.prepare << "get_people()", into(person));
proc.execute(true);
Я ожидаю, что person
иметь данные от первого лица, но он содержит только один столбец с именем хранимой процедуры (т. е. «get_people»).
Так что я не знаю, что я делаю здесь неправильно или не делаю. Это код PL / pgSQL или код SOCI? Возможно, SOCI не поддерживает динамическое связывание для хранимых процедур. Кроме того, этот метод позволит мне читать только первую строку, но как насчет остальных строк? Я знаю, что SOCI поставляется с rowset
класс для чтения наборов результатов, но в документации сказано, что он работает только с запросами. Пожалуйста помоги.
SELECT get_people()
вернет один столбец типа people
, названный в честь процедуры.
SELECT * FROM get_people()
даст вам ожидаемое поведение, разлагая people
записи в составляющие их поля.
Судя по источник, это похоже на SOCI procedure
Класс (или, по крайней мере, его реализация Postgres) запрограммирован для запуска процедур SELECT ...
скорее, чем SELECT * FROM ...
,
Я думаю, это означает, что вам нужно написать свой собственный запрос, т.е.
statement stmt = (sql.prepare << "SELECT * FROM get_people()", into(person));
Других решений пока нет …