2013-07-26 3 views
0

Я выполняю вычисление в функции PL/pgSQL, и я хочу использовать результат этого вычисления в своем коде на C++. Каков наилучший способ сделать это?Обработка сообщения функции PL/pgSQL в коде C++

Я могу вставить этот результат в таблицу и использовать ее оттуда, но я не уверен, насколько хорошо это связано с лучшими практиками. Кроме того, я могу отправить сообщение stderr с RAISE NOTICE, но я не знаю, могу ли я использовать это сообщение в своем коде.

ответ

1

Детали здесь немного тонкие на земле, поэтому трудно сказать наверняка.

Категорически предпочтительнее, когда это возможно, просто получите прямое значение функции. SELECT my_function(args), если он возвращает единственный результат, или SELECT * FROM my_function(args);, если он возвращает строку или набор строк. Затем обрабатывайте результат, как любой другой результат запроса. Это part of the basic use of simple SQL and PL/PgSQL functions.

Других вариантов включают в себя:

  • Returning a refcursor. Это может быть полезно в некоторых случаях, когда вы хотите вернуть динамический набор результатов или несколько наборов результатов, хотя теперь он в основном заменяется RETURN QUERY и RETURN QUERY EXECUTE. Затем вы получите FETCH from the refcursor, чтобы получить строки результатов.

  • LISTENing for an event и having the function NOTIFY when the work is done, возможно с результатом в виде уведомлений. Это полезно, когда функция не обязательно вызывается в том же соединении, что и программа, которая хочет использовать свои результаты.

  • Создайте временную таблицу в функции, затем SELECT из таблицы из сеанса, который вызвал функцию.

  • Извлечение сообщений журнала через RAISE и установка client_min_messages, чтобы вы их получили, а затем обработали. Это очень уродливый способ сделать это, и его следует избегать любой ценой.

  • INSERT Выполнение результатов в существующую не временную таблицу, затем SELECT их вывод после совершения транзакции, и строки становятся видимыми для других транзакций.

Что лучше? Это полностью зависит от того, что вы пытаетесь сделать. Почти во всех случаях правильная вещь - просто вызвать функцию и обработать возвращаемое значение, но в особых случаях есть исключения.