Я выполняю вычисление в функции PL / pgSQL, и я хочу использовать результат этого вычисления в своем коде C ++. Какой лучший способ сделать это?
Я могу вставить этот результат в таблицу и использовать его оттуда, но я не уверен, насколько хорошо это сочетается с лучшими практиками. Также я могу отправить сообщение stderr
с RAISE NOTICE
но я не знаю, могу ли я использовать это сообщение в своем коде.
Детали здесь немного тонкие, поэтому трудно сказать наверняка.
Сильно предпочтительным, когда это возможно, является просто получить возвращаемое значение функции напрямую. SELECT my_function(args)
если он возвращает один результат, или SELECT * FROM my_function(args);
если он возвращает строку или набор строк. Затем обработайте результат как любой другой результат запроса. Это часть базового использования простых функций SQL и PL / PgSQL.
Другие варианты включают в себя:
Возврат рефкурсора. Это может быть полезно в некоторых случаях, когда вы хотите вернуть динамический набор результатов или несколько наборов результатов, хотя теперь он в основном заменен RETURN QUERY
а также RETURN QUERY EXECUTE
, Ты тогда FETCH
от рекурсорачтобы получить строки результата.
LISTEN
для события а также имея функцию NOTIFY
когда работа сделана, возможно с результатом как полезная нагрузка уведомления. Это полезно, когда функция не обязательно вызывается в том же соединении, что и программа, которая хочет использовать свои результаты.
Создайте временную таблицу в функции, затем SELECT
из таблицы из сеанса, который вызвал функцию.
Излучение сообщений журнала через RAISE
и настройка client_min_messages
поэтому вы получаете их, а затем обрабатываете их. Это очень уродливый способ сделать это, и его следует избегать любой ценой.
INSERT
объединяя результаты в существующую временную таблицу, затем SELECT
их вывод, как только транзакция фиксируется и строки становятся видимыми для других транзакций.
Что лучше? Это полностью зависит от того, что вы пытаетесь сделать. Почти во всех случаях правильное действие — просто вызвать функцию и обработать возвращаемое значение, но в особых случаях есть исключения.
Других решений пока нет …