2016-12-13 5 views
1

Я получаю сообщение об ошибке:многозначной функция вызывается в контексте, который не может принимать множество

set-valued function called in context that cannot accept a set

при выполнении этой функции на RETURN QUERY EXECUTE линии:

PLSQL $ cat lookup_email.pl 
CREATE OR REPLACE FUNCTION app.lookup_email(ident_id bigint,sess bigint,company_id bigint,email varchar) 
RETURNS SETOF RECORD as $$ 
DECLARE 
    rec RECORD; 
    comp_id bigint; 
    server_session bigint; 
    schema_name varchar; 
    query varchar; 
BEGIN 
    schema_name:='comp' || company_id; 
    select app.session.session into server_session from app.session where app.session.identity_id=ident_id and app.session.session=sess; 
    IF FOUND 
    THEN 
     BEGIN 
      query:='SELECT i.email,u.user_id FROM app.identity as i,' || schema_name || '.uzer as u WHERE i.email like ''%' || email || '%'' and i.identity_id=u.identity_id'; 
      RAISE NOTICE 'executing: %',query; 
      RETURN QUERY EXECUTE query; 
      RETURN; 
     EXCEPTION 
      WHEN OTHERS THEN 
       RAISE NOTICE ' query error (%)',SQLERRM; 

     END; 
    END IF; 
END; 
$$ LANGUAGE plpgsql; 

Это Ouput из PSQL:

dev=> select app.lookup_email(4,730035455897450,6,'u'); 
NOTICE: executing: SELECT i.email,u.user_id FROM app.identity as i,comp6.uzer as u WHERE i.email like '%u%' and i.identity_id=u.identity_id 
NOTICE: query error (set-valued function called in context that cannot accept a set) 
lookup_email 
-------------- 
(0 rows) 

Я знаю, что запрос не содержит ошибок, поскольку он работает в другом сеансе psql:

dev=> SELECT i.email,u.user_id FROM app.identity as i,comp6.uzer as u WHERE i.email like '%u%' and i.identity_id=u.identity_id; 
    email  | user_id 
----------------+--------- 
[email protected] |  1 
(1 row) 

Так почему Postgres жалуются, если я объявил моя функция, как быть RETURNS SETOF RECORD? Где моя ошибка?

+0

Что объясняет Эван, все верно и хорошо, но вы все равно не должны получать эту ошибку с помощью текущих Postgres. Какая у вас версия? ('SELECT version()') –

ответ

2

So, why is Postgres complaining if I declared my function being a SET of RECORD ??? Where is my error?

  1. Позвоните своему Set Возвращение функции в предложении FROM.
  2. Всегда указывайте свои типы.

Это называется Set Возвращение функции, но вы хотите, чтобы указать композиционный тип

Это совершенно действительно,

RETURNS SETOF RECORD $$ 

Однако, вы можете позвонить ему,

SELECT app.lookup_email(4,730035455897450,6,'u') 
AS t(col1 type, col2 type) 

Контекст, который вы не можете назвать нетипизированным SRF, является тем, который d oes не имеет определения таблицы. Этот синтаксис может получ может получить неприятный, так просто легче изменить RETURNS SETOF RECORD к

RETURNS TABLE(col1 type, col2 type) AS $$ 

Поскольку каждая таблица имеет свой тип под тем же именем, вы также можете сделать

RETURNS SETOF myTable AS $$ 

Найти больше информации в the docs

+0

Мне нравится использовать 'return table (col_1 type, col_2 type)' than 'casting' return data' select x, y from function_a() as (x type, y type). –