2017-05-02 2 views
0

Ce sont les définitions de type qui me sont fournisfonctions Postgresql

create type IR as (pattern_number integer, uoc_number integer); 

Mon progrès en cours est:

create or replace function q1(pattern text, uoc_threshold integer) 
    returns setof IR 
    as $$ 
    BEGIN 
    RETURN QUERY 
    select count(code) from temp where code like $1; 
    RETURN QUERY 
    select count(code) from temp where code like $1 and uoc > $2; 

    END; 
$$ language plpgsql; 

Ma sortie doit être comme ceci: Requête: -

select * 
from q1('ECO%', 6); 

pattern_number | uoc_number 
80    |   5  

Je reçois une erreur en disant:

ERROR: structure of query does not match function result type
DETAIL: Returned type bigint does not match expected type integer in column 1.
CONTEXT: PL/pgSQL function q1(text,integer) line 3 at RETURN QUERY

Comment résoudre ce problème?

+0

Votre fonction retourne deux lignes avec une seule colonne (bigint). Vous voulez une seule ligne avec une seule colonne qui est un enregistrement. –

+0

est-ce que je comprends bien? vous voulez 'select count (code) de temp où code comme $ 1' comme motif_number et' select count (code) de temp où code comme $ 1 et uoc> $ 2' comme uoc_number? .. J'ai ajouté la réponse avec le code - sic? –

+0

@VaoTsun Oui. C'est exactement ce que je veux mais votre réponse ne semble pas résoudre l'erreur –

Répondre

1

Est-ce que vous voulez? ..

create or replace function q1(pattern text, uoc_threshold integer) 
    returns setof IR 
    as $$ 
    BEGIN 
    RETURN QUERY 
    select (select count(code) from temp where code like $1)::integer 
    ,(
    select count(code) from temp where code like $1 and uoc > $2)::integer; 

    END; 
$$ language plpgsql; 
+0

Vous l'avez bien fait mais l'erreur est toujours là. C'est la même erreur exacte. –

+0

@JohnKeaton a ajouté le casting implicite - fonctionne maintenant? .. –