2015-09-13 2 views
0

У меня есть функция PgSQL объявлена ​​как:SOCI, функция PgSQL возвращения запись таблицы - type_conversion не работает

CREATE FUNCTION auth.read_session(session_id varchar) RETURNS auth.sessions 

Он возвращает одну запись из таблицы auth.sessions. У меня есть SOCI type_conversion, которая отлично работает, когда Я запускаю select * from auth.sessions where id = :id. Он работает, когда найдена совпадающая запись и когда результат равен NULL. Однако, когда я меняю заявление:

select * from auth.read_session('invalid'); 

я получаю исключение:

Нулевое значение не допускается для данного типа во время выполнения «выберите * из auth.read_session („недопустимый“)» ,

Я попытался с перечислением столбцов, передав soci :: indicator и т. Д. Я не могу заставить его работать. Исключение составляет база type_conversion <>.

В типа-преобразования-traits.h есть комментарий о том, что:

// по умолчанию черты класса type_conversion, действует как пройти через для строки :: получить() // когда никакой фактической конвертации необходим.

Почему перевод не требуется? Да, моя функция возвращает запись типа таблицы «auth.sessions». Должно ли оно возвращать RECORD, чтобы преобразование было запущено?

ответ

0

По-видимому, единственный способ, которым это может быть сделано, - вернуть функцию в записи SETOF. Я считаю, что преобразование не требуется, так как в моем случае весь результат был NULL, и его нельзя каким-то образом отнести к моему собственному типу. Возврат одной записи типа таблицы работает до тех пор, пока не будет никакого результата.

Это будет работать, если функция была предназначена для всегда возврата записи, даже если пустой, но все же «запись».

0

PadThink Вы правы в отношении возвращения. Чтобы вызвать эту функцию так, как вы делаете, вам нужно вернуть записи QUERY, TABLE или SETOF.

http://www.postgresql.org/docs/9.2/static/xfunc-sql.html

+0

Да, док говорит: «Если последний запрос происходит не вернуть ни одной строки на всех, нулевое значение будет возвращено». В то время я не был уверен в этом, так как в psql один и тот же запрос каким-то образом показывает мне «пустую строку», а не просто NULL. Интересно, как это делается, поскольку unseting echo_hidden не раскрывает никакой магии. Но psql, похоже, следует за объявленным типом возвращаемого значения и дает пустой пул вместо NULL. – PadThink