DO $$
DECLARE
rec RECORD;
outcome BOOLEAN;
rule TEXT;
BEGIN
-- Assume the record references a single row that contains the columns under test in the rule
rule := 'columnA > 30 OR columnB < 50';
END;
$$
LANGUAGE plpgsql;
Aqui está um bloco conciso com um exemplo da regra que gostaria de avaliar em relação ao registro. Imagino que precise de EXECUTE
uma instrução SQL dinâmica.
Quero determinar o tipo do registro dinamicamente em tempo de execução, pois tenho acesso fácil a outra string com o nome da tabela. Eu imaginei lançar para table_name%ROWTYPE
. Pelo que entendi, não consigo converter dinamicamente um RECORD para um tipo composto em tempo de execução.
Pensei então em usar row_to_json(rec)
, mas precisaria avaliar a regra em relação a esse objeto JSON. Não estou familiarizado com como fazer isso em PL/pgSQL.
Estou buscando de um CURSOR para um RECORD porque quero um iterador que possa passar para diferentes funções que não tenha a sobrecarga de uma TEMPORARY TABLE. Sou bastante novo em PL/pgSQL, diria apenas alguns milhares de LOC na linguagem, então ainda estou aprendendo como trabalhar com suas estruturas de controle. Estou pensando que talvez precise fazer backup um pouco e escolher diferentes controles e/ou estruturas de dados para o problema. Como você abordaria esse problema?
Não podemos converter
record
para um tipo de linha bem definido, simplesmente porque nenhuma conversão foi definida. Não é possível para um tipo de entrada anônimo. Mas tudo pode ser convertidotext
por meio de funções básicas de E/S, até mesmorecord
. Portanto, usetext
como trampolim.Ainda precisamos de SQL dinâmico para converter a string
rule
em código SQL - que está sempre aberto à injeção de SQL . Certifique-se de não receber informações de fontes não confiáveis!Você sugeriu que isso
rec
se baseia em um tipo de tabela real. Podemos trabalhar com isso (ou qualquer tipo de linha registrada). Dizer:Então:
violino
Observe que os nomes das colunas do registro são apenas ruído; eles estão perdidos no elenco. Somente os nomes das colunas da tabela registrada (
t1
) ficam visíveis após a conversão. Portanto, certifique-se de que o tipo de linha seja adequado!Relacionado:
Provavelmente, existe uma abordagem mais simples. Raramente encontrei a necessidade de usar um cursor explícito em PL/pgSQL. Normalmente, uma tentativa de aplicar padrões de outros RDBMS.