2016-12-13 2 views
1

Ich erhalte den Fehler akzeptieren kann:mengenwertigen Funktion in Zusammenhang genannt, die nicht einen Satz

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

wenn diese Funktion bei RETURN QUERY EXECUTE Zeilen ausführen:

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; 

Dies ist der Ausgang von 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) 

Ich weiß, dass die Abfrage keinen Fehler enthält, weil es in einer anderen psql-Sitzung funktioniert:

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) 

Warum beschwert Postgres, wenn ich meine Funktion als RETURNS SETOF RECORD Wesen erklärt? Wo ist mein Fehler?

+0

Was Evan erklärt, ist alles richtig und gut, aber Sie sollten diesen Fehler mit dem aktuellen Postgres nicht bekommen. Was ist deine Version? ('SELECT version()') –

Antwort

2

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

  1. Rufen Sie Ihre Set-Funktion in einer Rückkehr FROM-Klausel.
  2. Geben Sie immer Ihre Typen an.

Es hat ein Set Return Funktion genannt, aber Sie wollen

Das ist völlig gültig, den Verbundtyp

RETURNS SETOF RECORD $$ 

jedoch angeben, können Sie mit ihm rufen müssen,

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

Der Kontext, in dem Sie einen nicht typisierten SRF nicht aufrufen können, ist einer, der d oes haben keine Tabellendefinition. Diese Syntax gett kann, kann böse, bekommen so einfach ist es einfacher RETURNS SETOF RECORD zu

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

zu ändern, da jeder Tisch seine Art unter dem gleichen Namen hat, können Sie auch

RETURNS SETOF myTable AS $$ 

weitere Informationen in the docs Finden Sie

+0

Ich verwende 'return table (col_1 type, col_2 type)' als 'casting' zurückgegebene Daten' wähle x, y aus function_a() als (x type, y type). –

Verwandte Themen