Como posso endereçar uma coluna de um registro em uma função plpgsql dinamicamente?
No trecho a seguir tenho acesso a uma variável entity.colname
que contém a coluna que deve ser verificada na estrutura do controle IF. Estou procurando como posso substituir a foobar
parte no trecho abaixo por entity.colname
. Isso é possível em plpgsql?
IF NEW.foobar IS NULL THEN
RAISE EXCEPTION '% cannot be null', foobar;
END IF;
Isso é algo que poderia, mas não funciona.
IF NEW.entity.colname IS NULL THEN
RAISE EXCEPTION '% cannot be null', entity.colname;
END IF;
O exemplo acima é apenas para ilustrar o que pretendo alcançar, não julgue a funcionalidade. :)
Estou usando o PostgreSQL 9.1.
Isso é complicado, porque os identificadores não podem ser variáveis em SQL simples. Você precisa usar SQL dinâmico com
EXECUTE
- o que ainda é complicado, porque as variáveis não são visíveis dentroEXECUTE
de .Aqui está uma demonstração de como contornar isso:
Melhorado com a ideia de @Jack no comentário.
Você não pode usar o plpgsql embutido
FOUND
porque não é definido porEXECUTE
(exceto porRETURN QUERY EXECUTE
- more here ). É por isso que eu useiGET DIAGNOSTICS ...
inicialmente. Mas finalmente simplificou com a ideia de @Jack.quote_ident()
garante que o nome seja sintaticamente válido e protege contra SQLi .supondo que a pergunta seja sobre gatilhos (e não tenho 100% de certeza de que entendi a pergunta), algo nesse sentido pode ser o caminho a percorrer:
* editado para permitir o caso em que o tipo de coluna é desconhecido (obrigado @Erwin!)