Tenho o que considero ser um problema relativamente simples, mas depois de meia hora ainda não tenho ideia de como resolvê-lo.
Em uma WHERE
cláusula de consulta do PostgreSQL, preciso me referir a um valor em vez de usá-lo diretamente. A consulta será executada dentro de um script Ruby, e não posso interpolar diretamente o valor que preciso obter do meu ambiente.
Minha pergunta é
CREATE MATERIALIZED VIEW my_mat_view AS
SELECT ...
...
WHERE occurred_at BETWEEN NOW() - INTERVAL '?? HOURS' AND NOW()
E o número de horas usado para calcular o intervalo é definido na INTERVAL_HOURS
variável de ambiente. Como mencionado, posso substituir ??
pela interpolação porque está entre aspas simples.
Minha ideia é usar uma variável (ou algo que produza o mesmo resultado) para mover a interpolação para fora das aspas simples.
A opção mais próxima da solução que encontro é
DO $$
DECLARE myVar INT;
BEGIN
myVar := #{ENV['INTERVAL_HOURS'};
CREATE MATERIALIZED VIEW my_mat_view AS
SELECT ...
...
WHERE occurred_at BETWEEN NOW() - INTERVAL 'myVar HOURS' AND NOW()
END $$;
Que deve interpolar corretamente, mas produz
Query 1 ERROR at Line 1: : ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function inline_code_block line 5 at SQL statement
Tentei substituir SELECT
por PERFORM
, mas a visualização não foi criada (e nenhum erro foi retornado).
O que estou esquecendo aqui? Posso seguir um caminho diferente (por exemplo, WITH
uma cláusula)?