On 2013-12-18 15:23, Matheus de Oliveira wrote:
2013/12/18 Eloi <[email protected]>Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em "PascalCase" e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('"OrigEm"', 'destino'); Obrigado. Cumprimentos,Simples. Sua função não executa nada por causa da seguinte consulta: SELECT tablename FROM pg_tables WHERE schemaname = sch_from; Veja que você passou '"OrigEm"' para sch_from, logo essa consulta ficaria: SELECT tablename FROM pg_tables WHERE schemaname = '"OrigEm"'; Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem aspas duplas, logo sua consulta não traz nenhum registros e o loop não é executado. A solução é não passar com aspas duplas na chamada da função e tratar dentro da mesma: CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; SELECT sys_move_tables('OrigEm', 'destino'); Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres [1]
Certo, já funciona. Obrigado pela ajuda! Eloi _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
