Saudações,

Uma coisa que sempre senti muita falta foi o fato de o editor de Query 
do pgAdmin não mostrar a estrutura de uma tabela/view facilmente. Sempre 
tinha que mudar de tela e procurar pela tabela que quero. Isso leva 
algum tempo, principalmente quando estou codificando alguma SP.
Alguns programas trazem com uma simples tecla de atalho a estrutura da 
uma tabela que estiver selecionada.

Recentemente resolvi criar uma macro no pgAdmin para tentar suprir esse 
falta que senti. Conclui hoje a macro e resolvi compartilhar com vocês, 
quem sabe alguém esteja sentindo a mesma necessidade.
Ainda falta algumas informações, mas já dá para usar!

Para utilizar, crie uma macro com o código abaixo.
Para executar, basta selecionar a tabela/view que deseja e teclar o 
atalho selecionado para a macro.

Fiz a macro na versão 7.4, mas creio que vá funcionar em outras versões.
Tem algumas "adaptações técnicas" como enviar um exception no final para 
não sair da tela de mensagens.

Sugestões são muito bem vindas. Caso alguem queira compartilhar suas 
macros, acho que será bem proveitoso!

Segue o código:
CREATE OR REPLACE FUNCTION sp_xyz_desc_tabela_view(varchar)
  RETURNS void AS
'DECLARE
    prTabela                ALIAS FOR $1;
    rec                        RECORD;
    sSQL                     TEXT;
    s TEXT;
BEGIN
    sSQL := ''SELECT b.attname AS campo, c.typname AS tipo,
                                                        (CASE b.attlen 
When -1 then (b.atttypmod - 4) else b.attlen end)::varchar as digitos,
                                                        (CASE 
b.attnotnull When '' || quote_literal(''t'') || ''  Then '' || 
quote_literal(''S'') || ''  Else '' || quote_literal(''N'') || ''  END) 
AS nulo,
                                                        (CASE 
b.atthasdef When '' || quote_literal(''t'') || ''  Then '' || 
quote_literal(''S'') || ''  Else '' || quote_literal(''N'') || ''  END) 
AS default
                                            FROM pg_class a
                                            JOIN pg_attribute b ON 
(b.attrelid = a.relfilenode)
                                            JOIN pg_type c ON (c.typelem 
= b.atttypid AND c.typlen = -1)
                                            WHERE  b.attstattarget = -1 AND
                                                         a.relname = '' 
|| quote_literal(prTabela) || ''
                                            ORDER BY b.attnum'';
    s := ''\n*** ATRIBUTOS\n Nome'' || lpad('' '', 26) || ''Campo'' || 
lpad('' '', 10) || ''TAMANHO   NULO  DEFAULT'';
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.campo || lpad('' '', 30 - length(rec.campo))
                                 || rec.tipo || lpad('' '', 15 - 
length(rec.tipo))
                                 || rec.digitos || lpad('' '', 10 - 
length(rec.digitos))
                                 || rec.nulo || lpad('' '', 6 - 
length(rec.nulo))
                                 || rec.default || lpad('' '', 3 - 
length(rec.default));
    END LOOP;
    --raise notice ''%'',s;


    s := s || ''\n\n *** CHAVES PRIMARIAS'';
    sSQL := ''SELECT b.relname FROM pg_catalog.pg_index  a
                            LEFT JOIN pg_class b ON (b.relfilenode = 
a.indexrelid)
                            LEFT JOIN pg_class c ON (a.indrelid = 
c.relfilenode)
                            WHERE c.relname = '' || 
quote_literal(prTabela) || ''
                            AND a.indisprimary = '' || quote_literal(''t'');
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.relname;
    END LOOP;


    s := s || ''\n\n *** RESTRICOES DE UNICIDADE'';
    sSQL := ''SELECT b.relname FROM pg_catalog.pg_index  a
                            LEFT JOIN pg_class b ON (b.relfilenode = 
a.indexrelid)
                            LEFT JOIN pg_class c ON (a.indrelid = 
c.relfilenode)
                            WHERE c.relname = '' || 
quote_literal(prTabela) || ''
                            AND a.indisprimary = '' || 
quote_literal(''f'') || ''
                            AND a.indisunique = '' || quote_literal(''t'');
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.relname;
    END LOOP;

    s := s || ''\n\n *** INDICES'';
    sSQL := ''SELECT b.relname FROM pg_catalog.pg_index  a
                            LEFT JOIN pg_class b ON (b.relfilenode = 
a.indexrelid)
                            LEFT JOIN pg_class c ON (a.indrelid = 
c.relfilenode)
                            WHERE c.relname = '' || 
quote_literal(prTabela) || ''
                            AND a.indisprimary = '' || 
quote_literal(''f'') || ''
                            AND a.indisunique = '' || quote_literal(''f'');
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.relname;
    END LOOP;

    s := s || ''\n\n *** RESTRIÇÕES'';
    sSQL := ''SELECT  a.conname, a.consrc
                            FROM pg_catalog.pg_constraint a
                            LEFT JOIN pg_class b ON (a.conrelid = 
b.relfilenode)
                            WHERE contype = '' || quote_literal(''c'') 
|| '' AND b.relname = '' || quote_literal(prTabela);
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.conname  || lpad('' '', 30 - 
length(rec.conname))
                                 || rec.consrc;
    END LOOP;

    s := s || ''\n\n *** RELACIONAMENTOS'';
    sSQL := ''SELECT  a.conname
                            FROM pg_catalog.pg_constraint a
                            LEFT JOIN pg_class b ON (a.conrelid = 
b.relfilenode)
                            WHERE contype = '' || quote_literal(''f'') 
|| '' AND b.relname = '' || quote_literal(prTabela);
    FOR rec IN EXECUTE sSQL LOOP
        s := s ||
             ''\n '' || rec.conname;
    END LOOP;
   
    raise notice ''% \n\n\n\n\n\n .'',s;
   
    sSQL := ''DROP FUNCTION sp_xyz_desc_tabela_view(varchar)'';
    EXECUTE sSQL;
    RAISE EXCEPTION '' '';
END; '
  LANGUAGE 'plpgsql' VOLATILE;
 
SELECT sp_xyz_desc_tabela_view('$SELECTION$');

Att

Evandro
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a