Eu escrevi a seguinte função para consultar dados de tabelas e colunas que dou como argumentos:
create or replace function field_summaries(gap interval , _tbl anyelement, _col text)
returns SETOF anyelement as
$func$
BEGIN
RETURN QUERY EXECUTE
'select
time_bucket(' || gap || ', time)::text as hour,
avg(' || _col ||'),
min(' || _col ||'),
max(' || _col ||')
from ' || pg_typeof(_tbl) || ' d
where d.device_id in (
select device_id from sensors)
group by hour';
END
$func$ language sql stable;
O problema é que ao chamar a função assim:
select field_summaries('5minutes', NULL:: m_13, 'temperature');
Eu recebo o seguinte erro:
ERROR: syntax error at or near ":"
LINE 2: time_bucket(00:05:00, time)::text as hour, ...
^
QUERY: select
time_bucket(00:05:00, time)::text as hour,
avg(temperature),
min(temperature),
max(temperature)
from m_13 d
where d.device_id in (
select device_id from sensors)
group by hour
CONTEXT: PL/pgSQL function field_summaries(interval,anyelement,text) line 3 at RETURN QUERY
Alguém tem ideia do que pode ser isso?
Altere o
gap
tipo de dados deinterval
paratext
e coloque-o entre aspas simples em sua consulta dinâmica.db<>fique aqui
O motivo do seu erro é o fato de você apenas concatenar o parâmetro na string. Ao usar
EXECUTE
, os parâmetros devem ser indicados usando$1, $2, ...
dentro da string e os valores devem ser passados com aUSING
cláusula doEXECUTE
comando.Além disso, SQL dinâmico deve ser criado usando a função format() . Por um lado, porque ele pode lidar adequadamente com identificadores (usando o
%I
espaço reservado). E torna o SQL mais fácil de ler também.Como as colunas e seus tipos de dados são fixos, eu também mudaria a função para
returns table(...)
porque é mais fácil de usar depois.Então a função deve ficar assim:
Você precisará ajustar os tipos de dados das colunas de saída na
returns table()
peça.