Как сделать динамическое связывание с функцией PL / pgSQL, используя SOCI?

У меня есть эта функция 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 класс для чтения наборов результатов, но в документации сказано, что он работает только с запросами. Пожалуйста помоги.

1

Решение

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));
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]