2017-08-03 2 views
0

J'ai donc une fonction select_id_from_table(_t). Il choisit une certaine colonne de la table (_t) où _t est un nom de table en tant que paramètre. Je l'appelle comme SELECT select_id_from_table('tablename') .Maintenant Je veux créer une autre fonction où la fonction fait quelque chose comme ceci:passer paramètre et référence dans une fonction de mise à jour dans postgresql

CREATE OR REPLACE FUNCTION myfunction(_u type1, _t type2) returns void as $$ 
BEGIN 
UPDATE (_u) set score=score+1 where _u.id in _t.id; 
END; 
$$ LANGUAGE plpgsql 

Le problème est qu'il ne peut pas passer le paramètre correctement. Et aussi ce que devraient être type1 et type2? _u et _t sont les deux noms des tables. J'ai essayé:

$$begin 
create temp table lid as (select * from select_id_from_table(_t)); 
execute format ('update '||quote_ident(_u) ||' set score= score+1 where 
'||quote_ident(_u) ||'.id_ in (
select * from select_id_from_table ('||quote_ident(_t)||') as 
abc)'); 
end;$$ 

J'ai aussi essayé de créer une table temporaire, sélectionnez select_id_from_table(_t) dans cette table temporaire et faire référence ultérieurement. Mais je ne sais toujours pas comment le citer en execute format(''). Toute idée serait appréciée.

Répondre

0

Je suppose que select_id_from_table est une fonction renvoyant SETOF <something> et que le type de retour peut être transtypé en text.

Je n'ai pas testé, mais je le ferais semblable à ceci:

DECLARE 
    in_clause text; 
BEGIN 
    SELECT string_agg(quote_literal(t::text), ', ') INTO in_clause 
     FROM select_id_from_table(_u) s(t); 
    EXECUTE format ('UPDATE %I 
        SET score = score + 1 
        WHERE %I.id_ =ANY (' || in_clause || ')', 
        _u, _u); 
END; 
+0

je change à string_agg (t :: texte, '') et où% I.id_ en (..) alors ça marche. Je vous remercie! –