Estou escrevendo um procedimento armazenado para obter nomes de banco de dados e tabelas em variáveis e, em seguida, enviarei esses valores para a cláusula IN.
CREATE OR REPLACE PROCEDURE bhuvi(db varchar(100), tbls varchar(100))
LANGUAGE plpgsql
AS $$
DECLARE
rec RECORD;
v timestamp;
tables_s varchar(100);
BEGIN
select '''' + REPLACE(tbls, ',', ''',''') + '''' into tables_s;
FOR rec IN select table_schema, table_name from information_schema.tables where table_catalog in (db) and table_type='BASE TABLE' and table_schema not in ('pg_catalog','information_schema') and table_name in (tables_s)
LOOP
select now() into v;
RAISE INFO ' % printing... schema = % and table = %',v, rec.table_schema, rec.table_name;
END LOOP;
END;
$$;
Se eu chamar este procedimento, está apenas mostrando CALL. Sem resultados.
Mas no meu FOR LOOP, se eu remover o and table_name in (tables_s)
, consigo imprimir todos os nomes de tabelas e esquemas.
Mas algo errado com os vários nomes de tabela na variável. Sem isso está funcionando.
Alguém pode me ajudar a descobrir o que estava errado no meu script?
A melhor solução é não passar um único
varchar
parâmetro, mas um array:Então você pode chamá-lo, por exemplo, assim:
Se você não puder alterar o código de chamada para lidar com array, converta as strings separadas por vírgula em arrays