Структура запроса не соответствует типу результата функции
После изменения типа (путем приведения) из bigint в текст моя функция PLPGSQL перестала работать. Это ошибка, которую я получаю:
dev=> select * from app.get_companies(4,808739954140037) ;
NOTICE: Data rows were NOT found (structure of query does not match function result type)
company_id_str | company_name
----------------+--------------
(0 rows)
dev=>
И это моя функция:
CREATE OR REPLACE FUNCTION app.get_companies(ident_id bigint,sess bigint)
RETURNS TABLE(company_id_str text,company_name text) as $$
DECLARE
server_session bigint;
BEGIN
select app.session.session from app.session where app.session.identity_id=ident_id and app.session.session=sess into server_session;
IF FOUND
THEN
BEGIN
RETURN QUERY SELECT quote_ident(app.company.company_id::text)::text as company_id_str,app.company.name as company_name FROM app.company,app.identcomp WHERE app.company.company_id=app.identcomp.company_id and app.identcomp.identity_id=ident_id;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Data rows were NOT found (%)',SQLERRM;
RETURN;
END;
ELSE
RAISE NOTICE 'Session row was NOT found';
RETURN;
END IF;
END;
$$ LANGUAGE plpgsql;
Почему происходит эта ошибка, если я применяю приведение и определяю вывод как TABLE?
Таблица app.company определяется как:
create table app.company (
company_id bigserial,
date_inserted timestamp,
name varchar(64)
);
2 ответа
Решение
app.company.name
является varchar(64)
в то время как company_name
возвращенной таблицы text
, В ролях app.company.name
в text
,
Если вы не поймаете исключение в теле функции (для чего?), Вы получите более подробное сообщение об ошибке:
ERROR: structure of query does not match function result type
DETAIL: Returned type character varying(64) does not match expected type text in column 2.
Если вы меняете тип возврата существующей функции, то вам нужно удалить существующую функцию и снова вам нужно создать ту же функцию.
Чтобы удалить функцию:
DROP FUNCTION [ IF EXISTS ] name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] [, ...]
[ CASCADE | RESTRICT ]