Muitas tabelas em meu banco de dados compartilham um layout comum, em particular, elas têm uma serial
chave primária com o nome do nome da relação. Atualizar essas tabelas de dentro de um aplicativo da Web geralmente envolve uma consulta do formulário:
UPDATE table SET attribute = x WHERE table_id = y
Isso é tão comum que tenho um procedimento armazenado que executa esta tarefa:
CREATE OR REPLACE FUNCTION setvalue(
relname text,
row_id integer,
colname text,
newvalue text)
RETURNS void AS
$BODY$
BEGIN
EXECUTE format('UPDATE %I SET %I = $1 WHERE %I = $2', relname, colname, relname || '_id', colname) USING row_id;
END;
$BODY$
LANGUAGE plpgsql;
Infelizmente, isso não funciona para tipos não textuais. Por exemplo, atualizar uma date
coluna fornece ERROR: column ... is of type date but expression is of type text
. Supondo que o texto seja uma representação literal válida do tipo pretendido, existe uma maneira segura de fazer o DBMS descobrir o tipo certo e fazer a coisa certa?
Minha própria solução até agora é colar a string literal na consulta:
ou apenas
Isso funciona para, por exemplo, tipos de data formatados apropriadamente (
'1990-05-04'
). Provavelmente, isso sacrifica a capacidade de reutilizar o plano de consulta.