On 2013-12-18 15:23, Matheus de Oliveira wrote:
2013/12/18 Eloi <e...@openmailbox.org>

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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a