Em 23 de março de 2010 11:28, Jose Luis Ramos
<[email protected]> escreveu:
> Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo:
>
> cdrger=# \dt
>              Lista de relações
>  Esquema |      Nome      |  Tipo  |   Dono
> ---------+----------------+--------+----------
>  public  | cdrger20090227 | tabela | postgres
>  public  | cdrger20090306 | tabela | postgres
>  public  | cdrger20090311 | tabela | postgres
>  public  | cdrger20090319 | tabela | postgres
>  public  | cdrger20090320 | tabela | postgres
>  public  | cdrger20090324 | tabela | postgres
>  public  | cdrger20090325 | tabela | postgres
>  public  | cdrger20090326 | tabela | postgres
>  public  | cdrger20090327 | tabela | postgres
>  public  | cdrger20090328 | tabela | postgres
>  public  | cdrger20090329 | tabela | postgres
>  public  | cdrger20090330 | tabela | postgres
> (12 registros)
>
> Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
> (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
> tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
> por diante. O objetivo é gerar uma base menor que a base que estou lendo.
> Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
> uma base de um notebook para ser utilizada pela área comercial da empresa.
> Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
> com PostgreSQL esta semana ... Obrigado.
>


Tente uma função do tipo:

CREATE OR REPLACE FUNCTION sua_função(prefixo text) RETURNS void AS $$
DECLARE
   tabela text;
   novatabela text;
   n int;
BEGIN
   FOR tabela IN EXECUTE 'SELECT table_name FROM
information_schema.tables WHERE table_name LIKE ' || prefixo || '%'
LOOP
      novatabela = 'novoprefixo' || substring(tabela,7);
      EXECUTE 'CREATE TABLE ' || novatabela || 'AS SELECT * FROM ' ||
tabela || ' WITH NO DATA';
      EXECUTE 'SELECT count(*)/10 FROM ' || tabela INTO n;
      FOR i = 1 to n LOOP
         EXECUTE 'INSERT INTO ' || novatabela || ' SELECT * FROM ' ||
tabela || ' LIMIT 1 OFFSET ' || (i-1)*10::text;
      END LOOP;
   END LOOP;
   RETURN;
END;
$$ LANGUAGE plpgsql;

Osvaldo
PS.: Não testada
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a