Estou tentando criar uma UDF que crie um recurso de cláusula VIEW
dinamicamente usando o USING
recurso. O problema é que EXECUTE
não aceitará o parâmetro passado no CREATE VIEW
comando.
CREATE OR replace FUNCTION test(name varchar) RETURNS void LANGUAGE plpgsql AS $$
BEGIN
EXECUTE format('create or replace view %I as select $1 as id limit 1;',$1) using $1;
RETURN;
END
$$;
Teste:
select test('tabel_view');
Saída atual:
Erro SQL [42P02]: ERRO: não há parâmetro $1
Onde: teste de função PL/pgSQL (caractere variável) linha 3 em EXECUTE
O mesmo funciona para CREATE TABLE
:
CREATE OR REPLACE FUNCTION test(name varchar) RETURNS void LANGUAGE plpgsql AS $$
BEGIN
EXECUTE format('create table %I as select $1 as id limit 1;',$1) using $1;
RETURN;
END
$$;
Estou tentando dessa maneira porque a concatenação de strings é propensa à injeção de SQL. Além disso, a UDF em que estou trabalhando terá um array como entrada.
Alguma ideia de como resolver esse problema?