tag:blogger.com,1999:blog-33719158984599016682024-03-05T05:20:52.469-03:00Meu Blog de PostgreSQL!!!No ar desde 2007!
Blog com informações e notícias sobre o banco de dados PostgreSQL, aquele que todos adoramos usar. Trata-se de uma ferramenta livre e de código aberto, mantida por uma comunidade ativa de usuários da qual você é convidado fazer parte.
Textos, ideias e outras contribuições podem ser enviadas para Cláudio Bezerra Leopoldino: claudiob_br@yahoo.com.brCláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.comBlogger254125tag:blogger.com,1999:blog-3371915898459901668.post-1838186394991759852015-05-14T23:52:00.002-03:002015-05-14T23:53:06.416-03:00Saiu a chamada de trabalhos para a PGBR 2015!<br />
<div class="threaded" id="shellcontent">
</div>
<div id="shellinner" role="presentation">
<div class="glass fresh-toolbar " id="toolbar" role="presentation">
<div class="commontasks shaded" id="yui_3_16_0_1_1431658050419_1571">
<div class="hasthreadmsg threadtoolbar" id="pagetoolbar">
</div>
</div>
</div>
</div>
<div class="glass fresh-toolbar " id="toolbar" role="presentation">
<div class="commontasks shaded" id="yui_3_16_0_1_1431658050419_1571">
<div class="hasthreadmsg threadtoolbar" id="pagetoolbar">
</div>
</div>
</div>
<div class="offscreen" data-tid="tabinbox" data-title="Entrada" id="inboxcontainer" role="main" style="visibility: hidden;">
PessoasRepasso as informações sobre a chamada de trabalhos paraaRe</div>
Saiu a chamada de trabalhos para a PGBR 2015, em Porto Alegre. Ótima oportunidade para enviar aquela palestra, aquele trabalho que você está fazendo...<br />
<br />
Peço que repasse. Divulgue a quem puder se interessar!<br />
<br />
======================================================== <br />
Está aberta a chamada de trabalhos (palestras e painéis acadêmicos) para<br />
o PGBR2015 [1].<br />
<br />
Atenção para as datas importantes [2]:<br />
<br />
14/05/2015 - Abertura da chamada para os trabalhos<br />
15/07/2015 - Encerramento da chamada para os trabalhos<br />
31/07/2015 - Notificação dos autores sobre trabalhos aceitos<br />
30/08/2015 - Publicação da agenda oficial<br />
<br />
Esse ano estamos organizando uma chamada diferenciada para<br />
Tutoriais/Treinamentos, então aguardem novidades.<br />
<br />
[1] <a href="http://pgbr.postgresql.org.br/2015/#call-for-papers" id="yui_3_16_0_1_1431658050419_3670" rel="nofollow" target="_blank">http://pgbr.postgresql.org.br/2015/#call-for-papers</a><br />
[2] <a href="http://pgbr.postgresql.org.br/2015/#scheduled-dates" id="yui_3_16_0_1_1431658050419_3669" rel="nofollow" target="_blank">http://pgbr.postgresql.org.br/2015/#scheduled-dates</a><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com3tag:blogger.com,1999:blog-3371915898459901668.post-29893878551190682582015-04-26T18:59:00.000-03:002015-04-26T19:07:23.272-03:00Programe-se para o PGBR 2015!É com grande satisfação que me incluo entre os que divulgam a <a href="http://pgbr.postgresql.org.br/2015/" target="_blank"><b>PGBR 2015</b></a>. Este é o maior evento nacional da comunidade do banco de dados PostgreSQL, e um ótimo lugar para aprender, fazer amigos e divulgar seu trabalho. A edição de 2015 será nos dias 18, 19 e 20 de novembro, em Porto Alegre!<br />
<br />
Sites do evento: <br />
<br />
<br />
<a href="http://pgbr.postgresql.org.br/2015/">http://pgbr.postgresql.org.br/2015/</a><br />
<a href="https://www.facebook.com/pgbr2015">https://www.facebook.com/pgbr2015</a><br />
<br />
<b>Não deixe de ir ao evento!</b><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-49260099047895235582015-02-26T18:41:00.002-03:002015-02-26T18:41:40.505-03:00Como Monitorar o Banco de Dados? Existem Ferramentas para Isso?<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
Me mandaram uma dúvida por correio e decidi comentar no blog. Como monitorar o servidor de banco de dados PostgreSQL? Existem ferramentas para isso?</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
Bom, existem três maneiras de se monitorar o SGBD. Postgresql ou de outro tipo:</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
1 - Utilizar uma ferramenta de outros;</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
2 - Empregar uma ferramenta desenvolvida por você;</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
3 - Utilizar recursos oferecidos pelo SGBD.</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
Consideremos seus prós e contras:</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5692">
<b>1 - Utilizar uma ferramenta de outros;</b></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6469">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6469">
A ferramenta livre que você deseja para monitorar servidores se chama <a href="http://www.zabbix.com/" target="_blank">ZABBIX</a>. Não a conheço em profundidade, mas é ótima, bastante utilizada!</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6469">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6469" style="text-align: center;">
<b>Figura 1 - Zabbix em ação</b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0Pbnopq9RsK0ceMGA6KBuwnQjcIBkmyUWObKrKugs4aalhJIc5VNlZL6OfaAQEsaraR2El1BmAlg_-g2RfhUxKaG4sCEDW7l69x6QxwPAtwhBkWBiJCRZdBLFfrpOgo42DCl_1btNH_Y/s1600/zabbix-network-monitoring-system-PacketLife.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV0Pbnopq9RsK0ceMGA6KBuwnQjcIBkmyUWObKrKugs4aalhJIc5VNlZL6OfaAQEsaraR2El1BmAlg_-g2RfhUxKaG4sCEDW7l69x6QxwPAtwhBkWBiJCRZdBLFfrpOgo42DCl_1btNH_Y/s1600/zabbix-network-monitoring-system-PacketLife.png" height="231" width="320" /></a></div>
<br /><div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6468">
Certamente existem outras proprietárias de software houses, e também de consultorias, que podem ser muito boas! </div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6468">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6468">
<b>2 - Empregar uma ferramenta desenvolvida por você;</b></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6468">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
Você tem capacidade, mas nem sempre o tempo para adotar esta opção. Mas se você puder tentar, é uma experiência sem igual! </div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
Vale a pena reutilizar classes e scripts do DBA, códigos de software livre, tudo o que estiver à mão. </div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
Se sua ferramenta for boa e você puder, existe possibilidade de compartilhar com a comunidade.</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<b>3 - Utilizar recursos oferecidos pelo SGBD.</b></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
O monitoramento do banco sem ferramentas específicas pode ser feito de duas formas principais.</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5812">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_5974">
- Configure a geração do log e leia o registro das operações realizadas e dos tempos de resposta. Você vai precisar de conhecimento sobre a <a href="http://www.postgresql.org/docs/9.4/static/runtime-config-logging.html" target="_blank">configuração e funcionamento do log</a> do Postgresql;</div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
-
Consultas utilizando SELECT às tabelas dos metadados do sistema. É
possível saber, por exemplo, quantas conexões estão abertas e que
comandos estão sendo executados.Você vai precisar de conhecimentos sobre as <a href="http://www.postgresql.org/docs/9.4/static/catalogs.html" target="_blank">tabelas de sistema do Postgresql</a> para começar. </div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<b>Considerações Finais</b></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
Todas estas são boas opções! Adote inicialmente a que for a mais prática e realista, com o maior custo-benefício. <span style="color: red;"><b>Na prática, o que recomendo é adotar mais de uma forma de monitoramento!!!</b></span></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<br /></div>
<div data-setdir="false" dir="ltr" id="yui_3_16_0_1_1424985454883_6137">
<br /></div>
<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-38898660585292243082014-07-10T15:39:00.002-03:002014-07-10T15:39:27.514-03:00DBeaver: Concorrente Sério para o Squirrel Client<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFTi55ZstEEJIzleQHKNII9z_Lq_0qwIA12U9Ds66EK0adEwEU8ZYvNvQ4oVrk9MsfuxtXWKp4xwSwu0Epn6tb02v3to0_81RpPfIKDF8cPg8N63-EOGRAVSCTb66ioHPvzcHMwBkatdGB/s1600/dbeaverlogo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFTi55ZstEEJIzleQHKNII9z_Lq_0qwIA12U9Ds66EK0adEwEU8ZYvNvQ4oVrk9MsfuxtXWKp4xwSwu0Epn6tb02v3to0_81RpPfIKDF8cPg8N63-EOGRAVSCTb66ioHPvzcHMwBkatdGB/s1600/dbeaverlogo.png" /></a></div>
<br />
Boas ferramentas podem ajudar a organizar o trabalho e aumentar a produtividade. Quando falamos de bancos de dados, a necessidade de gerenciar conexões é crítica. A ferramenta <a href="http://dbeaver.jkiss.org/" target="_blank"><b>DBeaver</b></a> se une ao psql e ao Squirrel Client, posicionando-se como uma boa opção para gerenciamento de conexões, oferecendo recursos adicionais bastante úteis para criar conexões e scripts sql, relacionados ao postgresql e a outros SGBDs. Este post apresenta as características básicas deste software livre e de código aberto, sem a pretensão de esgotar as suas funcionalidades.<br />
<br />
<b>* Criação de conexão</b><br />
<br />
O DBeaver oferece a possibilidade de baixar automaticamente o driver do postgresql na criação de uma conexão. O download funcionou, baixando o driver da versão 9.1 do banco. <br />
A ferramenta oferece um driver manager que permite a migração de um conexão de um driver para outro mais recente, e a inclusão de novos drivers.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1KVia1lzxAvUcCwW-xutL4RjZd7hqPMFxmmNjVFbtjX80xEYF8Hw1OCKRuOuK1ljEDOEF2ShFDTZ8UQNJjeSKJ-N2DbpWbuE_jabDdyP5b2N7W4_tris1OetSHLNdujy0THRh8GF_r6i4/s1600/Captura_de_tela-Create+new+connection-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1KVia1lzxAvUcCwW-xutL4RjZd7hqPMFxmmNjVFbtjX80xEYF8Hw1OCKRuOuK1ljEDOEF2ShFDTZ8UQNJjeSKJ-N2DbpWbuE_jabDdyP5b2N7W4_tris1OetSHLNdujy0THRh8GF_r6i4/s1600/Captura_de_tela-Create+new+connection-1.png" height="294" width="320" /></a></div>
<div style="text-align: center;">
<b> Tipo de conexão</b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5b1rAZ5E6E8CoQsigyTYutL04yELdsv-gk3jTBrVA4NsS8SLC0VhskeXivDyT5lF9d0KRYrk7ST2GIbeENQpKq-b3nf_Za1SfKqbDukqDzb4FlQ0t9vVXl95cIefE-ZAJfK15l-6UGvvT/s1600/Captura_de_tela-Create+new+connection-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5b1rAZ5E6E8CoQsigyTYutL04yELdsv-gk3jTBrVA4NsS8SLC0VhskeXivDyT5lF9d0KRYrk7ST2GIbeENQpKq-b3nf_Za1SfKqbDukqDzb4FlQ0t9vVXl95cIefE-ZAJfK15l-6UGvvT/s1600/Captura_de_tela-Create+new+connection-2.png" height="294" width="320" /></a></div>
<div style="text-align: center;">
<b>Dados da Conexão</b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid45mW4YmRnuUbyoqyHAH86CUcJ3AMUmNBZRhjjNawtOc8B1_zIqxtI2Igyh-ZmQ6vxqOf_s2aoB9wBbdjcVi530DWhfuOmjwX0lN1U-e0ARcuGHtWLxSENrmd1BTcGQd5TWGd2pYeaJgr/s1600/Captura_de_tela-Create+new+connection-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEid45mW4YmRnuUbyoqyHAH86CUcJ3AMUmNBZRhjjNawtOc8B1_zIqxtI2Igyh-ZmQ6vxqOf_s2aoB9wBbdjcVi530DWhfuOmjwX0lN1U-e0ARcuGHtWLxSENrmd1BTcGQd5TWGd2pYeaJgr/s1600/Captura_de_tela-Create+new+connection-3.png" height="294" width="320" /></a></div>
<div style="text-align: center;">
<b>Criação da Conexão</b></div>
<br />
<b>* Editor SQL</b><br />
<br />
Apresenta recursos básicos úteis e atalhos relativamente simples de se utilizar.<br />
<br />
<b>Control + L - </b>Abre editor.<br />
<br />
<b>Alt + ENTER - </b>Executa parte selecionada do script.<br />
<br />
<b>Alt + X - </b>Executa o script todo.<br />
<br />
<b>Control + Space - </b>Oferece sugestões para completar os comandos SQL.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggehjrow1GN0wNh2y_1n3gKv1fPpj_PF9CuJJHiPm-H-KrIyHRvQPMgqM0CkD8uHQmCPwS2zp-tmjw0635IXgjpVoBBBaX9r6skvwKlqfeoJcDasf9FJK4uGzIDPBpqXsSxzAx9G9B7I0X/s1600/Captura_de_tela-DBeaver+-+General+-+Interface+visual.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggehjrow1GN0wNh2y_1n3gKv1fPpj_PF9CuJJHiPm-H-KrIyHRvQPMgqM0CkD8uHQmCPwS2zp-tmjw0635IXgjpVoBBBaX9r6skvwKlqfeoJcDasf9FJK4uGzIDPBpqXsSxzAx9G9B7I0X/s1600/Captura_de_tela-DBeaver+-+General+-+Interface+visual.png" height="227" width="320" /></a></div>
<div style="text-align: center;">
<b> Interface da Ferramenta</b></div>
<br />
<b>* Suporte a Projetos</b><br />
<br />
O DBeaver apresenta a organização das conexões em projetos, permitindo maior produtividade por parte do usuário. Um projeto no dbeaver consiste em um conjunto de conexões e scripts SQL. <br />
<br />
Os projetos criados na ferramenta podem ser exportados e importados, o que facilita o compartilhamento das conexões entre os membros de equipes de desenvolvimento.<br />
<br />
<b>* Controle do nível de isolamento das transações</b><br />
<br />
Através do menu "Database/Transaction Mode" é possível visualizar e alterar o nível de isolamento utilizado nas consultas.<br />
<br />
<b>* DBeaver X Squirrel</b><br />
<br />
Existe uma grande sobreposição de funcionalidades entre estas ferramentas. Utilizo mais o Squirrel client, por hábito, mas considero as opções como praticamente equivalentes.<br />
Os recursos para gerenciamento de drivers de conexão e o suporte a projetos tendem a dar vantagem ao DBeaver em longo prazo, caso o scuirrel não se atualize. <div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com2tag:blogger.com,1999:blog-3371915898459901668.post-58206683428788816632014-05-08T13:49:00.000-03:002014-05-08T13:49:01.146-03:00O PostgreSQL Não Implementa o comando INSERT com a Cláusula SET<pre style="font-family: inherit;">Você já utilizou a cláusula SET em um comando INSERT? No postgresql, com certeza, não, pois a mesma não está implementada até a versão atual, a 9.3. Esta sintaxe pode ser descrita conforme aparece abaixo:</pre>
<pre style="font-family: inherit;"> </pre>
<pre style="font-family: inherit;"></pre>
<pre style="font-family: inherit;"><b>INSERT INTO nome_tabela SET coluna1 = expressão1, coluna2 = expressão2, .... ;</b></pre>
<pre style="font-family: inherit;"> </pre>
<pre style="font-family: inherit;">O fato é que esta sintaxe pouco acrescentaria em termos de valor. É pouco conhecida e pouco utilizada, embora eu acredite que esteja implementada em outros SGBDs. Sua funcionalidade seria idêntica à do comando INSERT já implementado, agregando possivelmente um pouco em termos de compatibilidade, embora não me recorde de ferramentas ou sistemas que utilizem esta sintaxe nas minhas andanças. </pre>
<pre style="font-family: inherit;">
</pre>
<pre style="font-family: inherit;">Então porque estou comentando o fato do postgresql não implementar esta sintaxe?</pre>
<pre style="font-family: inherit;">
</pre>
<pre style="font-family: inherit;">Bom, justifico esta postagem por ter encontrado esta sintaxe em provas de concursos públicos, como nos exemplos abaixo. Não sei se a cláusula SET no INSERT faz parte do padrão ISO, mas não deixa de ser uma limitação, ainda que bem pequena.</pre>
<pre style="font-family: inherit;"> </pre>
<pre style="font-family: inherit;"><b>Exemplos: </b></pre>
<pre style="font-family: inherit;">
</pre>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black; font-size: large;"><b>Prova:
FCC - 2012 - MPE-PE - Analista Ministerial - Informática</b></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black; font-size: large;"><b>Disciplina:
Banco de Dados | Assuntos: SQL; </b></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">Após
a execução dos seguintes comandos SQL: </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">CREATE
TABLE livros (id INT, nome TEXT); </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">INSERT
INTO livros VALUES(1,'livro 1'); </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">INSERT
INTO livros (2,'livro 2'); </span></span>
</div>
<div style="color: red; font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<b><span style="font-size: x-small;">INSERT
INTO livros SET id=3,nome='livro 3'; </span></b>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">SELECT
id FROM livros; </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">O
resultado da consulta para a coluna id será </span></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;"> </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;">
</span><span style="color: black;"><span style="font-size: x-small;">a)
3, apenas. b) 1, apenas. c) 1, 2 e 3. d) 2 e 3, apenas. e) 1 e 3,
apenas.</span></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="font-size: large;"><br /></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black; font-size: large;"><b>Prova:
FCC - 2012 - MPE-PE - Técnico Ministerial - Informática</b></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black; font-size: large;"><b>Disciplina:
Banco de Dados | Assuntos: SQL; </b></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">Analise
os seguintes comandos em SQL:</span></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">CREATE
TABLE nota (id INT PRIMARY KEY,data TEXT,valor REAL); </span></span>
</div>
<div style="color: red; font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<b><span style="font-size: x-small;">INSERT
INTO nota SET id=1,data='01012012',valor=15.5; </span></b>
</div>
<div style="color: red; font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<b><span style="font-size: x-small;">INSERT
INTO nota SET id=1,data='03022012',valor=11.5; </span></b>
</div>
<div style="color: red; font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<b><span style="font-size: x-small;">INSERT
INTO nota SET id=2,data='01042012',valor=25.5; </span></b>
</div>
<div style="color: red; font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<b><span style="font-size: x-small;">INSERT
INTO nota SET id=20,data='10062012',valor=12.5; </span></b>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">SELECT
COUNT(*) FROM nota WHERE valor < 20; </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<br />
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;">O
resultado para a consulta efetuada será: </span></span></div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-size: x-small;"> </span></span>
</div>
<div style="font-family: inherit; line-height: 0.35cm; margin-bottom: 0cm;">
<span style="color: black;">
</span><span style="color: black;"><span style="font-size: x-small;">a)
12.5 b) 3 c) 11.5, 12.5 e 15.5 d) 2 e) 12.5 e 15.5</span></span></div>
<pre style="font-family: inherit;"> </pre>
<pre style="font-family: inherit;"><span style="font-family: inherit;"> </span></pre>
<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-5100019411624661902014-05-02T08:46:00.000-03:002014-05-02T08:46:12.159-03:00COALESCE: Trate decisões envolvendo campos nulos!A função COALESCE permite que se selecione, entre dois ou mais parâmetros, o primeiro valor não nulo, retornando nulo caso todos os valores passados como parâmetro sejam nulos. É um recurso que pode ser utilizado para dar mais elegância ao tratamento de valores nulos e ao mesmo tempo reduzir o tamanho das consultas, tornando-as mais fáceis de manter.<br /><br />A sintaxe é bem simples, pois a função COALESCE recebe uma lista de valores como parâmetro, separados por vírgula. <br /><br /><b>Exemplo 1: Apenas um parâmetro fornecido</b><br /><br />postgres=# SELECT COALESCE(1);<br /> coalesce <br />----------<br /> 1<br />(1 registro)<br /><br /><b>Exemplo 2: Dois parâmetros fornecidos</b><br /><br />postgres=# SELECT COALESCE(null,2);<br /> coalesce <br />----------<br /> 2<br />(1 registro)<br /><br /><b>Exemplo 3: Três parâmetros fornecidos</b><br /><br />postgres=# SELECT COALESCE(1,2,3);<br /> coalesce <br />----------<br /> 1<br />(1 registro)<br /><br /><b>Exemplo 4: O primeiro parâmetro é nulo.</b><br /><br />postgres=# SELECT COALESCE(null,2,3);<br /> coalesce <br />----------<br /> 2<br />(1 registro)<br /><br /><b>Exemplo 5: Os dois primeiros parâmetros são nulos.</b><br /><br />postgres=# SELECT COALESCE(null,null,3);<br /> coalesce <br />----------<br /> 3<br />(1 registro)<br /><br /><b>Exemplo 6: Exemplo com cinco parâmetros e valor do tipo data.</b><br /><br />postgres=# SELECT COALESCE(null, null, null, null, current_date);<br /> coalesce <br />------------<br /> 2014-05-02<br />(1 registro)<br /><br /><b>Exemplo 7: Exemplo utilizando campos de uma tabela como parâmetro.</b><br /><br />postgres=# CREATE TEMP TABLE TBL_COA(campo1 INTEGER, campo2 INTEGER, campo3 INTEGER);<br />postgres=# INSERT INTO TBL_COA VALUES (null,1,2);<br />postgres=# INSERT INTO TBL_COA VALUES (null,null,2);<br />postgres=# INSERT INTO TBL_COA VALUES (null,null,null);<br /><br />postgres=# SELECT COALESCE(campo1,campo2, campo3) FROM TBL_COA;<br /> coalesce <br />----------<br /> 1<br /> 2<br /> <br />(3 registros)<br /><br /><b>Exemplo 8: Implementação das condições do exemplo anterior utilizando a cláusula CASE. O plano de execução é o mesmo, mas o código fica bem mais complexo.</b><br />postgres=# SELECT <br />postgres-# CASE WHEN campo1 IS NOT NULL THEN campo1<br />postgres-# WHEN campo1 IS NULL AND campo2 IS NOT NULL THEN campo2<br />postgres-# WHEN campo1 IS NULL AND campo2 IS NULL AND campo3 IS NOT NULL THEN campo3<br />postgres-# ELSE null END AS simula_coalesce<br />postgres-# FROM TBL_COA;<br /> simula_coalesce <br />-----------------<br /> 1<br /> 2<br /> <br />(3 registros)<br /><br /><b>* Conclusões</b><br /><br />
- O uso de COALESCE pode tornar seu código mais enxuto e fácil de manter;<br /><br />
- Pode substituir a cláusula CASE no tratamento de valores NULOS, embora não haja ganho de desempenho.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com1tag:blogger.com,1999:blog-3371915898459901668.post-781068118102318162014-04-09T09:56:00.000-03:002014-04-09T09:56:39.895-03:00explain.depesz: Encontre a Causa da Lentidão em suas Consultas!O site <a href="http://explain.depesz.com/">http://explain.depesz.com/</a> disponibiliza uma ferramenta bastante útil, que formata, extrai e a apresenta de forma relativamente simples o conteúdo dos planos de execução do postgresql, permitindo uma análise mais fácil do mesmo. A promessa deste aplicativo é ajudar a encontrar a causa da lentidão nas consultas realizadas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirajypW7dU3BCA91JP6NdVTTJC_yWNEZbiUzeXBsVkCec7i37CvOy4TBPL4VxS9TouFU9LIjjhjGgbEiQC7iZau6yuB4pLFOLpxQwsotbniiyfy7LN-m1ARU5eIRZnBFv2DofnSHc93Zmk/s1600/Captura_de_tela-New+explain+%257C+explain.depesz.com+-+Mozilla+Firefox-submeter+um+plano+de+execu%25C3%25A7%25C3%25A3o.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirajypW7dU3BCA91JP6NdVTTJC_yWNEZbiUzeXBsVkCec7i37CvOy4TBPL4VxS9TouFU9LIjjhjGgbEiQC7iZau6yuB4pLFOLpxQwsotbniiyfy7LN-m1ARU5eIRZnBFv2DofnSHc93Zmk/s1600/Captura_de_tela-New+explain+%257C+explain.depesz.com+-+Mozilla+Firefox-submeter+um+plano+de+execu%25C3%25A7%25C3%25A3o.png" height="377" width="640" /></a></div>
<div style="text-align: center;">
<b> Site da ferramenta</b></div>
<br />
Para utilizar a ferramenta, basta acessar o site, colar na caixa de texto o resultado do comando EXPLAIN <consulta>, e acionar a opção para submeter o plano. O sistema processará o plano de execução e apresentará o resultado de forma gráfica, indicando em tons de amarelo e vermelho os pontos mais críticos em termos de custo de processamento. Desta forma, fica mais fácil fazer o ajuste de performance de consultas.</consulta><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRaHxBGkgptqtLSlT_kfgltI8R7m70hyphenhyphenotSL1Icycpq8mzA21Is66r3hN7E9STj8p8C0m9hKY9xnolqeHApF8WXDVcw2yWgWvmoKpZnthdE5hOnsQ5ixwW45OXxlurNYZS3I4UKwUQxrgS/s1600/Captura_de_tela-yKy+%253A+SELECT+*+FROM+PG_TABLES+WHERE+tablename+IN+%2528%2527pg_type%2527%252C+%2527pg_class%2527%2529%253B+%257C+explain.depesz.com+-+Mozilla+Firefox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRaHxBGkgptqtLSlT_kfgltI8R7m70hyphenhyphenotSL1Icycpq8mzA21Is66r3hN7E9STj8p8C0m9hKY9xnolqeHApF8WXDVcw2yWgWvmoKpZnthdE5hOnsQ5ixwW45OXxlurNYZS3I4UKwUQxrgS/s1600/Captura_de_tela-yKy+%253A+SELECT+*+FROM+PG_TABLES+WHERE+tablename+IN+%2528%2527pg_type%2527%252C+%2527pg_class%2527%2529%253B+%257C+explain.depesz.com+-+Mozilla+Firefox.png" height="378" width="640" /></a></div>
<div style="text-align: center;">
<b> Plano analisado</b></div>
<br />
Já escrevi alguma coisa sobre o comando explain <a href="http://postgresqlbr.blogspot.com.br/2007/05/comando-explain.html" target="_blank">aqui</a>, <a href="http://postgresqlbr.blogspot.com.br/2007/05/o-comando-explain-ii.html" target="_blank">aqui</a> e <a href="http://postgresqlbr.blogspot.com.br/2007/05/o-comando-explain-iii.html" target="_blank">aqui</a>.<br />
<br />
Pessoalmente gostei da ferramenta, embora ainda não me tenha sido realmente útil. Peço que testem e me digam o que acharam.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com2tag:blogger.com,1999:blog-3371915898459901668.post-31515986001465216292014-04-02T14:30:00.004-03:002014-04-02T14:30:36.525-03:00As Funções GREATEST e LEASTAs funções GREATEST e LEAST recuperam, respectivamente, o maior e o menor valor não nulo em uma lista de valores, caso existam. São bastante úteis e, embora não sejam parte do padrão sql, são compatíveis com funções similares fornecidas por outros SGBDs.<br />
<br />
Saliento que para recuperar o maior e menor valores em colunas de uma tabela, devem ser utilizadas as funções de agregação MAX e MIN, respectivamente.<br />
<br />
<b>* Exemplos</b><br />
<br />
<b>1 - Exemplo básico</b><br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST(1,2);</div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /><b>2 - Exemplo básico com três parâmetros</b><br />
<b> </b> <br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST(1,2, 3, 4);</div>
<br />
<br />
<br /><b>3 - Exemplo básico com datas</b><br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST(current_date,current_date + 10);</div>
<br /><b>4 - Exemplo básico com cálculo simples</b> <br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST(1*2,2*1);</div>
<br />
<br />
<br /><b>5 - Exemplo com valor nulo ignora o nulo</b><br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST(10,11,null);</div>
<br />
6<b> - Exemplo gerando valor nulo</b><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">SELECT GREATEST(null,null); </span><br />
<br /><b>7- Exemplo com dados textuais</b> <br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT GREATEST('ANA','CLA','AVA');</div>
<br />
<br />
<br /><b>8 - Exemplo com timestamps</b> <br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">SELECT GREATEST(timestamp '2014-04-02 14:30:00', timestamp '2014-04-02 14:30:01');</span><br />
<br />
<br />
<br />
<br />
<br />
<b>9 - Exemplos do uso de LEAST</b><br /><br />
<div style="font-family: "Courier New",Courier,monospace;">
SELECT LEAST(1,2, 3, 4);<br />SELECT LEAST(current_date,current_date + 10);<br />SELECT LEAST(1*2,2*1);<br />SELECT LEAST(10, 11, null);<br />SELECT LEAST('ANA','CLA','AVA');<br />SELECT LEAST(timestamp '2014-04-02 14:30:00', timestamp '2014-04-02 14:30:01');</div>
<br />
<b>10 - Exemplo de comparação entre campos de uma mesma tabela</b><br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
CREATE TEMP TABLE NOTA (codigo REAL, nota1 REAL, nota2 REAL, nota3 REAL);<br />INSERT INTO NOTA VALUES (1,10,9,8);<br />INSERT INTO NOTA VALUES (2,9.5,8,8.5);<br />INSERT INTO NOTA VALUES (3,1,2,3);<br /><br />SELECT codigo, GREATEST(nota1, nota2, nota3) AS MAIOR_NOTA, LEAST(nota1, nota2, nota3) AS MENOR_NOTA FROM NOTA;</div>
<div style="font-family: "Courier New",Courier,monospace;">
</div>
<div style="font-family: "Courier New",Courier,monospace;">
</div>
<div style="font-family: "Courier New",Courier,monospace;">
</div>
<div style="font-family: "Courier New",Courier,monospace;">
</div>
<br /><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-46692229622745935472014-02-28T13:07:00.002-03:002014-02-28T13:08:03.080-03:00Minha Foto Oficial da PGBR 2013!PgBR 2013. <br />
<br />
Eu estava lá.<br />
<br />
Foi muito bom! REcomendo a PgBR 2014!<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcZLLEk4NE3kCVhV7xzDyg1x9BTNVoNgGX3dsadxgI2BrXUt7HfUCT1qSwBRF6sWnhWOzp8K7-BkeoY1hNAZKlEH6-b83ibeNcLjdeinyCJ8d3XMaPB7bKQBMm2ckgR2iEqit3RsLthcO/s1600/pgbr2013.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNcZLLEk4NE3kCVhV7xzDyg1x9BTNVoNgGX3dsadxgI2BrXUt7HfUCT1qSwBRF6sWnhWOzp8K7-BkeoY1hNAZKlEH6-b83ibeNcLjdeinyCJ8d3XMaPB7bKQBMm2ckgR2iEqit3RsLthcO/s1600/pgbr2013.JPG" height="201" width="640" /></a></div>
<br /><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-52398942375604354202014-02-17T13:02:00.000-03:002014-03-13T08:37:34.021-03:00Simples e Útil: Visões Materializadas no PostgreSQL!Visões materializadas são recursos introduzidos na versão 9.3 do postgresql. Enquanto visões tradicionais reexecutam uma consulta sempre que são referenciadas, visões materializadas dispensam este esforço pelos seus dados já estarem guardados desde a sua criação ou do último refresh (atualização de visão). Pode-se dizer que uma visão materializada é um objeto que contém o resultado de uma consulta, facilitando o acesso aos dados nela contidos. <br />
<br />
A principal justificativa para se utilizar visões materializadas é a <b>aceleração de consultas em grandes massas de dados</b>. É importante observar que em sistemas com pouco espaço em disco e discos lentos, visões materializadas podem ter pouco efeito ou até impacto negativo por sobrecarregar ainda mais o hardware.<br />
<br />
<b>Para ter ainda mais desempenho,. é possível criar índices para visões materializadas</b>. <br />
<br />
No postgresql, a atualização de uma visão materializada é feita através do comando REFRESH MATERIALIZED VIEW, enquanto que a mudança do código da consulta da visão é feita através do comando ALTER MATERIALIZED VIEW. A exclusão de visões materializadas é feita com o comendo DROP MATERIALIZED VIEW. <br />
<br />
Sintaxe básica:<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">CREATE MATERIALIZED VIEW nome_tabela<br /> [ (nome_coluna [, ...] ) ]<br /> [ WITH ( storage_parameter [= value] [, ... ] ) ]<br /> [ TABLESPACE nome_tablespace ]<br /> AS consulta<br /> [ WITH [ NO ] DATA ]</b><br />
<b>Exemplo 1</b>: Criação de uma visão materializada simples<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">CREATE MATERIALIZED VIEW lista_tabelas AS</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT tablename FROM PG_TABLES ORDER BY tablename;</span></b><br />
<b>Exemplo 2</b>: Refresh dos dados de uma visão materializada, pelo comando REFRESH MATERIALIZED VIEW.<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">REFRESH MATERIALIZED VIEW lista_tabelas;</b><br />
<br />
<b>Exemplo 3</b>: Exclusão de uma visão materializada utilizando DROP MATERIALIZED VIEW. O comando drop view não exclui visões materializadas, e sim gera erro.<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">DROP MATERIALIZED VIEW lista_tabelas;</span></b><br />
<br />
<b>Exemplo 4</b>: Criação de uma visão materializada sem dados. Neste caso, o comando REFRESH MATERIALIZED VIEW pode ser utilizado para popular a visão armazenada.<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">CREATE MATERIALIZED VIEW lista_tabelas_nodata AS</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT tablename FROM PG_TABLES ORDER BY tablename WITH NO DATA;</span></b><br />
<b>Exemplo 5</b>: Criação de uma visão materializada simples, explicitando o tablespace utilizado<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">CREATE MATERIALIZED VIEW lista_indices TABLESPACE pg_default AS</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT schemaname, tablename, indexname, tablespace FROM PG_INDEXES;</span></b><br />
<b>Exemplo 6</b>: Criação de uma visão materializada simples, utilizando o storage parameter fillfactor. São aceitos todos os tipos de storage parameters de uma tabela padrão, exceto OIDs, pois visões materializadas não apresentam identificador OID para cada registro.<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">CREATE MATERIALIZED VIEW lista_indices_fill50 WITH (fillfactor = 50) AS<br />SELECT schemaname, tablename, indexname, tablespace FROM PG_INDEXES;</b><br />
<b>Exemplo 7</b>: Para saber quantas visões armazenadas você tem no seu servidor, utilize a visão <b>PG_MATVIEWS</b>.<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">SELECT * FROM PG_MATVIEWS;</span></b><br />
<br />
<b>Exemplo 8</b>: Alteração de visão materializada. O comando ALTER MATERIALIZED VIEW apresenta uma sintaxe mais elaborada, merecendo mais espaço em um texto futuro.<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">ALTER MATERIALIZED VIEW lista_tabelas RENAME TO lista_relacoes;</span></b><br />
<br />
<b>* Conclusões</b><br />
<br />
Visões materializadas são uma boa opção para aumento de performance sob certas condições. <br />
<br />
Também facilitam a importação de visões materializadas disponíveis em outros SGBDs como ORACLE e SQL SERVER.<br />
<br />
A implementação de visões materializadas é relativamente fácil e bastante útil.<br />
<br />
<b>Você já utilizou esta funcionalidade nos seus projetos? Qual foi a sua opinião?</b> <div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com2tag:blogger.com,1999:blog-3371915898459901668.post-83067239162410419802014-02-05T10:11:00.000-03:002014-02-05T10:11:15.319-03:00Gere uma Dimensão Temporal para o seu Data Warehouse Utilizando o Postgresql!A dimensão temporal em um data warehouse, e também em outros tipos de aplicação, pode assumir uma multitude de formatos. Encaminho a vocês o <a href="https://docs.google.com/spreadsheet/ccc?key=0AqX_LPR-VtE1dGtfRkp6bTdfUUZZY1diNm5wQkhLb0E&usp=sharing#gid=0" target="_blank">link de uma planilha</a> desenvolvida por Tomáš Greif, que simplesmente gera praticamente tudo o que você poderia precisar em termos de dimensão temporal para uso em data warehouse. Espero que ela facilite o seu trabalho. <b>Baixe e use à vontade!</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfI52AfCk9vNY67l2m9gKcd380_mOntNgINJd5Ang3xarM7bxLgBXtrmQXk38RCria43ollpGqfSG17CP4CcSMc6cvv61lwsPgr11kMbv-cSSnqlqLuDG0Kmgi-BCncaWFJUk6hMdPiUVy/s1600/Captura_de_tela-postgresql-data-warehouse-time-dimension+-+Google+Drive+-+Chromium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfI52AfCk9vNY67l2m9gKcd380_mOntNgINJd5Ang3xarM7bxLgBXtrmQXk38RCria43ollpGqfSG17CP4CcSMc6cvv61lwsPgr11kMbv-cSSnqlqLuDG0Kmgi-BCncaWFJUk6hMdPiUVy/s1600/Captura_de_tela-postgresql-data-warehouse-time-dimension+-+Google+Drive+-+Chromium.png" height="267" width="400" /></a></div>
<br />
<br />
<b>Não precisa de macros!</b> Para criar a tabela, inserir e atualizar dados, basta copiar as colunas H e seguintes para um editor de texto.<br />
<br />
A única ressalva é que a planilha ainda não suporta feriados, mas essa funcionalidade você pode adicionar :)<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com1tag:blogger.com,1999:blog-3371915898459901668.post-29653443826913776942014-01-30T16:38:00.002-03:002014-01-30T16:38:35.390-03:00O PostgreSQL e a Distinta Concorrência, segundo o Google TrendsO serviço <a href="http://www.google.com.br/trends/" target="_blank">Google Trends</a> é muito útil para pesquisas envolvendo a comparação de variáveis e suas tendências ao longo do tempo. Fiz uma pequena experiência em relação ao postgresql e compartilho aqui os resultados.<br />
<br />
<b>A Primeira Pesquisa</b><br />
<br />
A primeira pesquisa teve como bancos de dados investigados o Postgres, o Mysql, o Oracle e o Microsoft Sql Server.<br />
<br />
O Postgresql teve uma procura menor que a dos demais SGBDs, e uma tendência de queda, mas todos os bancos de dados da pesquisa apresentaram tendência de queda nas buscas. Me pareceu que a procura pelo Postgeresql caiu menos que a dos demais SGBDs, mas acho que há um viés da minha parte :)<br />
<br />
Me perguntei o porquê. Será que a área de banco de dados está em queda no momento? <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUGbK3zXsQUpcuZQZx_NxF043cAjX32iIEcv6gW0uRV_MTLReGEpL66tSxRl75pgTLKfP_uYZottJvcmTNLEmEazodVYvLamLQ9NrOI1EQIUPTQMNyWsjDrjITAtW2GPFwctb2lWJYmAA/s1600/Captura_de_tela-Google+Trends+-+Pesquisa+na+web+do+Google+interesse%253A+PostgreSQL%252C+MySQL%252C+Oracle+Database%252C+Microsoft+SQL+Server+-+Todo+o+mundo%252C+2004+-+presente+-+Mozilla+Firefox.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUGbK3zXsQUpcuZQZx_NxF043cAjX32iIEcv6gW0uRV_MTLReGEpL66tSxRl75pgTLKfP_uYZottJvcmTNLEmEazodVYvLamLQ9NrOI1EQIUPTQMNyWsjDrjITAtW2GPFwctb2lWJYmAA/s1600/Captura_de_tela-Google+Trends+-+Pesquisa+na+web+do+Google+interesse%253A+PostgreSQL%252C+MySQL%252C+Oracle+Database%252C+Microsoft+SQL+Server+-+Todo+o+mundo%252C+2004+-+presente+-+Mozilla+Firefox.png" height="268" width="400" /></a></div>
<br />
<br />
<br />
<b>A Segunda Pesquisa </b><br />
<br />
Além dos elementos da primeira pesquisa, <b>introduzi Cloud Computin</b>g na investigação. O resultado mostrou <b>aumento consistente de interesse em cloud computing e de queda no interesse nos bancos de dados tradicionais</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xzNIJ1M4vw3Ulwf0yvRSkOUpRP1bCU8cs8F4tbWXVHfrvbqsv1g79gJiuw-i37rSChrU1w36zZXN0v2UqAcm2ZKnr1s5mEtfvtxXg7myInWV41QHXy7tNpuQc8-hInYEDq31V73fokUu/s1600/FIG2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xzNIJ1M4vw3Ulwf0yvRSkOUpRP1bCU8cs8F4tbWXVHfrvbqsv1g79gJiuw-i37rSChrU1w36zZXN0v2UqAcm2ZKnr1s5mEtfvtxXg7myInWV41QHXy7tNpuQc8-hInYEDq31V73fokUu/s1600/FIG2.png" height="268" width="400" /></a></div>
<br />
<br />
Bom, em uma análise bem simplificada, pode-se pensar em uma tendência de crescimento de bancos de dados em nuvem em relação aos bancos de dados tradicionais. Mas em que grau? Só o futuro dirá! <br />
<br />
<br />
<b>Como Entender este Resultado?</b><br />
<br />
Sinceramente não tenho elementos para apresentar algo conclusivo, mas creio que as tecnologias tradicionais de bancos de dados estão consolidadas, enquanto que cloud computing apresenta mais novidades e inovação. Daí o maior interesse e tendência positiva de crescimento.<br />
<br />
O que você acha? Deixe uma nota nos comentários!<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com3tag:blogger.com,1999:blog-3371915898459901668.post-17957596786851374512014-01-27T15:59:00.001-03:002014-01-27T15:59:18.937-03:00Beltrano: Base de Dados em Português para o PostgreSQLÀs vezes ideias simples melhoram a nossa vida. Compartilhar projetos simples pode ajudar muita gente. Este é o caso do Beltrano, <b>base de dados em português desenvolvida para aplicações OLAP e OLTP e compatível com o postgresql</b>, pelo analista <a href="http://www.pentahonapratica.com.br/portal/?page_id=21" target="_blank">Fábio de Salles</a>, bastante conhecido na comunidade pentaho. O banco simula uma aplicação simples, com empregados, cursos e pedidos, ideal para treinamentos e o ensino de bancos de dados e tecnologias.<br />
<br />
O autor criou <a href="http://sourceforge.net/projects/openbisolutions/" target="_blank">projeto completo no sourceforge</a>, com a modelagem na ferramenta power architect, e os bancos de dados produzidos disponibilizados para download. Adicionalmente, colocou um <a href="http://www.pentahonapratica.com.br/portal/?page_id=132" target="_blank">tutorial com o passo a passo para a criação das bases no postgresql</a>.<br />
<br />
Você é livre para conhecer, baixar, utilizar e melhorar o Beltrano!<br />
<br />
Abaixo, modelagem da base OLTP:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP1Q6bA-r-RHP6cM4DsjFuQWj3wghudDWs6gDGI9LMt9WJ8nAmoc0hcMs_ZbLEjRRwTGULyfOPFKBfRTR3g4hgdU5dmrKR986Ll_irvhZ6UBRR89OlYbuLMh4L9yMO-j6NI6ilL4Q3vtTd/s1600/beltranooltp_diagrama.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP1Q6bA-r-RHP6cM4DsjFuQWj3wghudDWs6gDGI9LMt9WJ8nAmoc0hcMs_ZbLEjRRwTGULyfOPFKBfRTR3g4hgdU5dmrKR986Ll_irvhZ6UBRR89OlYbuLMh4L9yMO-j6NI6ilL4Q3vtTd/s1600/beltranooltp_diagrama.png" height="215" width="320" /></a></div>
<br /><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-60152199983729381312013-11-01T09:30:00.000-03:002013-11-01T09:30:08.134-03:00Faça Você Mesmo: Diagramas de Classe com as Tabelas do Catálogo do PostgreSQLAutomatizar tarefas complexas não é uma tarefa fácil. Dentro da área de banco de dados a elaboração e manutenção da modelagem do banco de dados é uma tarefa das mais difíceis. Os modelos simplesmente não refletem a realidade, ou são incompletos, por limitações das ferramentas ou pela baixa prioridade atribuída à modelagem. Esta postagem mostra as etapas para se fazer a geração automática de diagramas de classe com base no modelo de dados. Foram modelados os esquemas PG_CATALOG e INFORMATION_SCHEMA do postgresql, através do <a href="http://sourceforge.net/projects/dia-installer/" target="_blank">editor de diagramas DIA</a>, que pode ser baixada no sourceforge e funciona tanto no windows quanto no linux.<br />
<br />
<br />
<div style="text-align: center;">
<img alt="" src="data:image/png;base64,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" /></div>
<br />
A escolha da ferramenta de modelagem se deu pelo fato da mesma permitir a geração de diagramas complexos através de scripts em Python. Infelizmente, a documentação encontrada não é das melhores, o que dificulta este tipo de empreitada.<br />
<br />
Basicamente, foram seguidas as seguintes etapas para a geração dos diagramas:<br />
1 - Consultas aos metadados do postgresql, relativas aos esquemas desejados, gerando como resultado um script python;<br />
2 - Salvamento deste script em um arquivo texto; <br />
3 - Ajuste manual do script para alterar detalhes como textos apresentados e remoção de espaços;<br />
4 - Execução do script python de dentro da ferramenta DIA, para a criação do diagrama;<br />
5 - Ajuste manual de alguma imperfeição estética no diagrama gerado.<br />
<br />
Antes de saber como fazer, veja o resultado obtido com o mínimo de alterações manuais:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGcTWX0ixZdjPNLCp8JnbuYFi-IT2ZL8daJjOVD8wc46YNga7CN4zHfl2svLqXCpzuEgVr2JAVamrC8hjFRJuuE7BlgYaNikBtZ5uWuYWewqfQK-uyz-HHgd2-72iGnLMHtfwwz7YimqJI/s1600/PG_CATALOG.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGcTWX0ixZdjPNLCp8JnbuYFi-IT2ZL8daJjOVD8wc46YNga7CN4zHfl2svLqXCpzuEgVr2JAVamrC8hjFRJuuE7BlgYaNikBtZ5uWuYWewqfQK-uyz-HHgd2-72iGnLMHtfwwz7YimqJI/s320/PG_CATALOG.png" width="320" /></a></div>
<br /><br />
<div style="text-align: center;">
<b>Figura 1 - PG_CATALOG</b></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAb2f98iAfA3ODibGFqVP92KPX-JUsukV5_eskUTVhWyOrZGOre927aQ5IYxpCS1DGPe9ZfIqze75D1mqSsd6LO-0dxMfvRby-mH4YmsC9IrlGi0EPdymSXLZZ-Q139VJpFJnL0Cw4jMN1/s1600/INFORMATION_SCHEMA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="21" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAb2f98iAfA3ODibGFqVP92KPX-JUsukV5_eskUTVhWyOrZGOre927aQ5IYxpCS1DGPe9ZfIqze75D1mqSsd6LO-0dxMfvRby-mH4YmsC9IrlGi0EPdymSXLZZ-Q139VJpFJnL0Cw4jMN1/s320/INFORMATION_SCHEMA.png" width="320" /></a></div>
<br />
<div style="text-align: center;">
<b>Figura 2 - INFORMATION_SCHEMA </b></div>
<br />
<b>1 - Geração e Edição de Script Python - PG_CATALOG</b><br />
<br />
A geração do script python para a criação do diagrama foi feita utilizando-se sql no esquema do banco de dados desejado.<br />
<br />
Abaixo coloco a consulta de geração do diagrama do esquema pg_catalog. É mais simples do que parece, sendo composto por uma sequência de várias consultas, unidas por UNION ALL, gerando linhas de texto com o script:<br />
<br />
<b><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('diagram = dia.new("PG_CATALOG.dia")' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('data = diagram.data' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('display = diagram.display()' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('layer = data.active_layer' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('pg_objtype = "UML - Class"' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('oType = dia.get_object_type (pg_objtype)' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('theObjects = [diagram, data, layer, display, oType]' AS TEXT) as OBJETO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST(relname || ', h1, h2 = oType.create (' || 20*((row_number() OVER (PARTITION BY schemaname)) % 12) || ',' || 30*((row_number() OVER (PARTITION BY schemaname)) % 5) || ')' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('theObjects.append(' || relname || ')' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST(relname || '.properties["stereotype"] = "pg_catalog"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST(relname || '.properties["comment"] = "' || relname || ' Class"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST(relname || '.properties["name"] = "' || relname || '"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('attributes_' || relname || ' = []' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('attributes_' || table_name || '.append((''' || column_name || ''',''' || data_type ||''',''Value_not_set'',''' || column_name || '-' || data_type || ''',1,0,0)) ' AS TEXT) as OBJETO from information_schema.columns where table_schema = 'pg_catalog' AND table_name IN (SELECT relname as table_name FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog')</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST(relname || '.properties["attributes"] = attributes_' || relname as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('layer.add_object (' || relname || ')' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'pg_catalog'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('oType = dia.get_object_type ("UML - Activity")' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('oend, h1, h2 = oType.create (0,-1)' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('theObjects.append(oend)' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('oend.properties["text"] = "PG_CATALOG: Claudio Bezerra Leopoldino - Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com.br/ - claudiob_br@yahoo.com.br"' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('layer.add_object (oend)' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('diagram.save()' as TEXT) as OBJETO </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">UNION ALL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">SELECT CAST('print "Generation FINISHED"' as TEXT) as OBJETO;</span></span></b><br />
Após a execução deste script SQL, salve o resultado em arquivo texto com extensão .py e o edite, acrescentando, excluindo e alterando elementos.<br />
<br />
<b>2 - Script Python Produzido - PG_CATALOG</b> <br />
<br />
Abaixo coloco a listagem do script python produzido e editado:<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><b>diagram=dia.new("PG_CATALOG.dia")<br />data=diagram.data<br />display=diagram.display()<br />layer=data.active_layer<br />pg_objtype="UML - Class"<br />oType=dia.get_object_type(pg_objtype)<br />theObjects=[diagram,data,layer,display,oType]<br />pg_conversion,h1,h2=oType.create(20,30)<br />pg_foreign_data_wrapper,h1,h2=oType.create(40,60)<br />pg_collation,h1,h2=oType.create(60,90)<br />pg_range,h1,h2=oType.create(80,120)<br />pg_class,h1,h2=oType.create(100,0)<br />pg_opclass,h1,h2=oType.create(120,30)<br />pg_opfamily,h1,h2=oType.create(140,60)<br />pg_trigger,h1,h2=oType.create(160,90)<br />pg_auth_members,h1,h2=oType.create(180,120)<br />pg_operator,h1,h2=oType.create(200,0)<br />pg_attribute,h1,h2=oType.create(220,30)<br />pg_ts_parser,h1,h2=oType.create(0,60)<br />pg_default_acl,h1,h2=oType.create(20,90)<br />pg_depend,h1,h2=oType.create(40,120)<br />pg_statistic,h1,h2=oType.create(60,0)<br />pg_attrdef,h1,h2=oType.create(80,30)<br />pg_language,h1,h2=oType.create(100,60)<br />pg_tablespace,h1,h2=oType.create(120,90)<br />pg_db_role_setting,h1,h2=oType.create(140,120)<br />pg_seclabel,h1,h2=oType.create(160,0)<br />pg_shdepend,h1,h2=oType.create(180,30)<br />pg_event_trigger,h1,h2=oType.create(200,60)<br />pg_shseclabel,h1,h2=oType.create(220,90)<br />pg_aggregate,h1,h2=oType.create(0,120)<br />pg_index,h1,h2=oType.create(20,0)<br />pg_inherits,h1,h2=oType.create(40,30)<br />pg_rewrite,h1,h2=oType.create(60,60)<br />pg_ts_dict,h1,h2=oType.create(80,90)<br />pg_foreign_table,h1,h2=oType.create(100,120)<br />pg_constraint,h1,h2=oType.create(120,0)<br />pg_enum,h1,h2=oType.create(140,30)<br />pg_amproc,h1,h2=oType.create(160,60)<br />pg_extension,h1,h2=oType.create(180,90)<br />pg_shdescription,h1,h2=oType.create(200,120)<br />pg_pltemplate,h1,h2=oType.create(220,0)<br />pg_ts_config,h1,h2=oType.create(0,30)<br />pg_amop,h1,h2=oType.create(20,60)<br />pg_cast,h1,h2=oType.create(40,90)<br />pg_user_mapping,h1,h2=oType.create(60,120)<br />pg_type,h1,h2=oType.create(80,0)<br />pg_largeobject,h1,h2=oType.create(100,30)<br />pg_am,h1,h2=oType.create(120,60)<br />pg_largeobject_metadata,h1,h2=oType.create(140,90)<br />pg_ts_config_map,h1,h2=oType.create(160,120)<br />pg_ts_template,h1,h2=oType.create(180,0)<br />pg_database,h1,h2=oType.create(200,30)<br />pg_namespace,h1,h2=oType.create(220,60)<br />pg_proc,h1,h2=oType.create(0,90)<br />pg_foreign_server,h1,h2=oType.create(20,120)<br />pg_authid,h1,h2=oType.create(40,0)<br />pg_description,h1,h2=oType.create(60,30)<br />theObjects.append(pg_conversion)<br />theObjects.append(pg_foreign_data_wrapper)<br />theObjects.append(pg_collation)<br />theObjects.append(pg_range)<br />theObjects.append(pg_class)<br />theObjects.append(pg_opclass)<br />theObjects.append(pg_opfamily)<br />theObjects.append(pg_trigger)<br />theObjects.append(pg_auth_members)<br />theObjects.append(pg_operator)<br />theObjects.append(pg_attribute)<br />theObjects.append(pg_ts_parser)<br />theObjects.append(pg_default_acl)<br />theObjects.append(pg_depend)<br />theObjects.append(pg_statistic)<br />theObjects.append(pg_attrdef)<br />theObjects.append(pg_language)<br />theObjects.append(pg_tablespace)<br />theObjects.append(pg_db_role_setting)<br />theObjects.append(pg_seclabel)<br />theObjects.append(pg_shdepend)<br />theObjects.append(pg_event_trigger)<br />theObjects.append(pg_shseclabel)<br />theObjects.append(pg_aggregate)<br />theObjects.append(pg_index)<br />theObjects.append(pg_inherits)<br />theObjects.append(pg_rewrite)<br />theObjects.append(pg_ts_dict)<br />theObjects.append(pg_foreign_table)<br />theObjects.append(pg_constraint)<br />theObjects.append(pg_enum)<br />theObjects.append(pg_amproc)<br />theObjects.append(pg_extension)<br />theObjects.append(pg_shdescription)<br />theObjects.append(pg_pltemplate)<br />theObjects.append(pg_ts_config)<br />theObjects.append(pg_amop)<br />theObjects.append(pg_cast)<br />theObjects.append(pg_user_mapping)<br />theObjects.append(pg_type)<br />theObjects.append(pg_largeobject)<br />theObjects.append(pg_am)<br />theObjects.append(pg_largeobject_metadata)<br />theObjects.append(pg_ts_config_map)<br />theObjects.append(pg_ts_template)<br />theObjects.append(pg_database)<br />theObjects.append(pg_namespace)<br />theObjects.append(pg_proc)<br />theObjects.append(pg_foreign_server)<br />theObjects.append(pg_authid)<br />theObjects.append(pg_description)<br />pg_conversion.properties["stereotype"]="pg_catalog"<br />pg_foreign_data_wrapper.properties["stereotype"]="pg_catalog"<br />pg_collation.properties["stereotype"]="pg_catalog"<br />pg_range.properties["stereotype"]="pg_catalog"<br />pg_class.properties["stereotype"]="pg_catalog"<br />pg_opclass.properties["stereotype"]="pg_catalog"<br />pg_opfamily.properties["stereotype"]="pg_catalog"<br />pg_trigger.properties["stereotype"]="pg_catalog"<br />pg_auth_members.properties["stereotype"]="pg_catalog"<br />pg_operator.properties["stereotype"]="pg_catalog"<br />pg_attribute.properties["stereotype"]="pg_catalog"<br />pg_ts_parser.properties["stereotype"]="pg_catalog"<br />pg_default_acl.properties["stereotype"]="pg_catalog"<br />pg_depend.properties["stereotype"]="pg_catalog"<br />pg_statistic.properties["stereotype"]="pg_catalog"<br />pg_attrdef.properties["stereotype"]="pg_catalog"<br />pg_language.properties["stereotype"]="pg_catalog"<br />pg_tablespace.properties["stereotype"]="pg_catalog"<br />pg_db_role_setting.properties["stereotype"]="pg_catalog"<br />pg_seclabel.properties["stereotype"]="pg_catalog"<br />pg_shdepend.properties["stereotype"]="pg_catalog"<br />pg_event_trigger.properties["stereotype"]="pg_catalog"<br />pg_shseclabel.properties["stereotype"]="pg_catalog"<br />pg_aggregate.properties["stereotype"]="pg_catalog"<br />pg_index.properties["stereotype"]="pg_catalog"<br />pg_inherits.properties["stereotype"]="pg_catalog"<br />pg_rewrite.properties["stereotype"]="pg_catalog"<br />pg_ts_dict.properties["stereotype"]="pg_catalog"<br />pg_foreign_table.properties["stereotype"]="pg_catalog"<br />pg_constraint.properties["stereotype"]="pg_catalog"<br />pg_enum.properties["stereotype"]="pg_catalog"<br />pg_amproc.properties["stereotype"]="pg_catalog"<br />pg_extension.properties["stereotype"]="pg_catalog"<br />pg_shdescription.properties["stereotype"]="pg_catalog"<br />pg_pltemplate.properties["stereotype"]="pg_catalog"<br />pg_ts_config.properties["stereotype"]="pg_catalog"<br />pg_amop.properties["stereotype"]="pg_catalog"<br />pg_cast.properties["stereotype"]="pg_catalog"<br />pg_user_mapping.properties["stereotype"]="pg_catalog"<br />pg_type.properties["stereotype"]="pg_catalog"<br />pg_largeobject.properties["stereotype"]="pg_catalog"<br />pg_am.properties["stereotype"]="pg_catalog"<br />pg_largeobject_metadata.properties["stereotype"]="pg_catalog"<br />pg_ts_config_map.properties["stereotype"]="pg_catalog"<br />pg_ts_template.properties["stereotype"]="pg_catalog"<br />pg_database.properties["stereotype"]="pg_catalog"<br />pg_namespace.properties["stereotype"]="pg_catalog"<br />pg_proc.properties["stereotype"]="pg_catalog"<br />pg_foreign_server.properties["stereotype"]="pg_catalog"<br />pg_authid.properties["stereotype"]="pg_catalog"<br />pg_description.properties["stereotype"]="pg_catalog"<br />pg_conversion.properties["comment"]="pg_conversionClass"<br />pg_foreign_data_wrapper.properties["comment"]="pg_foreign_data_wrapperClass"<br />pg_collation.properties["comment"]="pg_collationClass"<br />pg_range.properties["comment"]="pg_rangeClass"<br />pg_class.properties["comment"]="pg_classClass"<br />pg_opclass.properties["comment"]="pg_opclassClass"<br />pg_opfamily.properties["comment"]="pg_opfamilyClass"<br />pg_trigger.properties["comment"]="pg_triggerClass"<br />pg_auth_members.properties["comment"]="pg_auth_membersClass"<br />pg_operator.properties["comment"]="pg_operatorClass"<br />pg_attribute.properties["comment"]="pg_attributeClass"<br />pg_ts_parser.properties["comment"]="pg_ts_parserClass"<br />pg_default_acl.properties["comment"]="pg_default_aclClass"<br />pg_depend.properties["comment"]="pg_dependClass"<br />pg_statistic.properties["comment"]="pg_statisticClass"<br />pg_attrdef.properties["comment"]="pg_attrdefClass"<br />pg_language.properties["comment"]="pg_languageClass"<br />pg_tablespace.properties["comment"]="pg_tablespaceClass"<br />pg_db_role_setting.properties["comment"]="pg_db_role_settingClass"<br />pg_seclabel.properties["comment"]="pg_seclabelClass"<br />pg_shdepend.properties["comment"]="pg_shdependClass"<br />pg_event_trigger.properties["comment"]="pg_event_triggerClass"<br />pg_shseclabel.properties["comment"]="pg_shseclabelClass"<br />pg_aggregate.properties["comment"]="pg_aggregateClass"<br />pg_index.properties["comment"]="pg_indexClass"<br />pg_inherits.properties["comment"]="pg_inheritsClass"<br />pg_rewrite.properties["comment"]="pg_rewriteClass"<br />pg_ts_dict.properties["comment"]="pg_ts_dictClass"<br />pg_foreign_table.properties["comment"]="pg_foreign_tableClass"<br />pg_constraint.properties["comment"]="pg_constraintClass"<br />pg_enum.properties["comment"]="pg_enumClass"<br />pg_amproc.properties["comment"]="pg_amprocClass"<br />pg_extension.properties["comment"]="pg_extensionClass"<br />pg_shdescription.properties["comment"]="pg_shdescriptionClass"<br />pg_pltemplate.properties["comment"]="pg_pltemplateClass"<br />pg_ts_config.properties["comment"]="pg_ts_configClass"<br />pg_amop.properties["comment"]="pg_amopClass"<br />pg_cast.properties["comment"]="pg_castClass"<br />pg_user_mapping.properties["comment"]="pg_user_mappingClass"<br />pg_type.properties["comment"]="pg_typeClass"<br />pg_largeobject.properties["comment"]="pg_largeobjectClass"<br />pg_am.properties["comment"]="pg_amClass"<br />pg_largeobject_metadata.properties["comment"]="pg_largeobject_metadataClass"<br />pg_ts_config_map.properties["comment"]="pg_ts_config_mapClass"<br />pg_ts_template.properties["comment"]="pg_ts_templateClass"<br />pg_database.properties["comment"]="pg_databaseClass"<br />pg_namespace.properties["comment"]="pg_namespaceClass"<br />pg_proc.properties["comment"]="pg_procClass"<br />pg_foreign_server.properties["comment"]="pg_foreign_serverClass"<br />pg_authid.properties["comment"]="pg_authidClass"<br />pg_description.properties["comment"]="pg_descriptionClass"<br />pg_conversion.properties["name"]="pg_conversion"<br />pg_foreign_data_wrapper.properties["name"]="pg_foreign_data_wrapper"<br />pg_collation.properties["name"]="pg_collation"<br />pg_range.properties["name"]="pg_range"<br />pg_class.properties["name"]="pg_class"<br />pg_opclass.properties["name"]="pg_opclass"<br />pg_opfamily.properties["name"]="pg_opfamily"<br />pg_trigger.properties["name"]="pg_trigger"<br />pg_auth_members.properties["name"]="pg_auth_members"<br />pg_operator.properties["name"]="pg_operator"<br />pg_attribute.properties["name"]="pg_attribute"<br />pg_ts_parser.properties["name"]="pg_ts_parser"<br />pg_default_acl.properties["name"]="pg_default_acl"<br />pg_depend.properties["name"]="pg_depend"<br />pg_statistic.properties["name"]="pg_statistic"<br />pg_attrdef.properties["name"]="pg_attrdef"<br />pg_language.properties["name"]="pg_language"<br />pg_tablespace.properties["name"]="pg_tablespace"<br />pg_db_role_setting.properties["name"]="pg_db_role_setting"<br />pg_seclabel.properties["name"]="pg_seclabel"<br />pg_shdepend.properties["name"]="pg_shdepend"<br />pg_event_trigger.properties["name"]="pg_event_trigger"<br />pg_shseclabel.properties["name"]="pg_shseclabel"<br />pg_aggregate.properties["name"]="pg_aggregate"<br />pg_index.properties["name"]="pg_index"<br />pg_inherits.properties["name"]="pg_inherits"<br />pg_rewrite.properties["name"]="pg_rewrite"<br />pg_ts_dict.properties["name"]="pg_ts_dict"<br />pg_foreign_table.properties["name"]="pg_foreign_table"<br />pg_constraint.properties["name"]="pg_constraint"<br />pg_enum.properties["name"]="pg_enum"<br />pg_amproc.properties["name"]="pg_amproc"<br />pg_extension.properties["name"]="pg_extension"<br />pg_shdescription.properties["name"]="pg_shdescription"<br />pg_pltemplate.properties["name"]="pg_pltemplate"<br />pg_ts_config.properties["name"]="pg_ts_config"<br />pg_amop.properties["name"]="pg_amop"<br />pg_cast.properties["name"]="pg_cast"<br />pg_user_mapping.properties["name"]="pg_user_mapping"<br />pg_type.properties["name"]="pg_type"<br />pg_largeobject.properties["name"]="pg_largeobject"<br />pg_am.properties["name"]="pg_am"<br />pg_largeobject_metadata.properties["name"]="pg_largeobject_metadata"<br />pg_ts_config_map.properties["name"]="pg_ts_config_map"<br />pg_ts_template.properties["name"]="pg_ts_template"<br />pg_database.properties["name"]="pg_database"<br />pg_namespace.properties["name"]="pg_namespace"<br />pg_proc.properties["name"]="pg_proc"<br />pg_foreign_server.properties["name"]="pg_foreign_server"<br />pg_authid.properties["name"]="pg_authid"<br />pg_description.properties["name"]="pg_description"<br />attributes_pg_conversion=[]<br />attributes_pg_foreign_data_wrapper=[]<br />attributes_pg_collation=[]<br />attributes_pg_range=[]<br />attributes_pg_class=[]<br />attributes_pg_opclass=[]<br />attributes_pg_opfamily=[]<br />attributes_pg_trigger=[]<br />attributes_pg_auth_members=[]<br />attributes_pg_operator=[]<br />attributes_pg_attribute=[]<br />attributes_pg_ts_parser=[]<br />attributes_pg_default_acl=[]<br />attributes_pg_depend=[]<br />attributes_pg_statistic=[]<br />attributes_pg_attrdef=[]<br />attributes_pg_language=[]<br />attributes_pg_tablespace=[]<br />attributes_pg_db_role_setting=[]<br />attributes_pg_seclabel=[]<br />attributes_pg_shdepend=[]<br />attributes_pg_event_trigger=[]<br />attributes_pg_shseclabel=[]<br />attributes_pg_aggregate=[]<br />attributes_pg_index=[]<br />attributes_pg_inherits=[]<br />attributes_pg_rewrite=[]<br />attributes_pg_ts_dict=[]<br />attributes_pg_foreign_table=[]<br />attributes_pg_constraint=[]<br />attributes_pg_enum=[]<br />attributes_pg_amproc=[]<br />attributes_pg_extension=[]<br />attributes_pg_shdescription=[]<br />attributes_pg_pltemplate=[]<br />attributes_pg_ts_config=[]<br />attributes_pg_amop=[]<br />attributes_pg_cast=[]<br />attributes_pg_user_mapping=[]<br />attributes_pg_type=[]<br />attributes_pg_largeobject=[]<br />attributes_pg_am=[]<br />attributes_pg_largeobject_metadata=[]<br />attributes_pg_ts_config_map=[]<br />attributes_pg_ts_template=[]<br />attributes_pg_database=[]<br />attributes_pg_namespace=[]<br />attributes_pg_proc=[]<br />attributes_pg_foreign_server=[]<br />attributes_pg_authid=[]<br />attributes_pg_description=[]<br />attributes_pg_statistic.append(('starelid','oid','Value_not_set','starelid-oid',1,0,0))<br />attributes_pg_statistic.append(('staattnum','smallint','Value_not_set','staattnum-smallint',1,0,0))<br />attributes_pg_statistic.append(('stainherit','boolean','Value_not_set','stainherit-boolean',1,0,0))<br />attributes_pg_statistic.append(('stanullfrac','real','Value_not_set','stanullfrac-real',1,0,0))<br />attributes_pg_statistic.append(('stawidth','integer','Value_not_set','stawidth-integer',1,0,0))<br />attributes_pg_statistic.append(('stadistinct','real','Value_not_set','stadistinct-real',1,0,0))<br />attributes_pg_statistic.append(('stakind1','smallint','Value_not_set','stakind1-smallint',1,0,0))<br />attributes_pg_statistic.append(('stakind2','smallint','Value_not_set','stakind2-smallint',1,0,0))<br />attributes_pg_statistic.append(('stakind3','smallint','Value_not_set','stakind3-smallint',1,0,0))<br />attributes_pg_statistic.append(('stakind4','smallint','Value_not_set','stakind4-smallint',1,0,0))<br />attributes_pg_statistic.append(('stakind5','smallint','Value_not_set','stakind5-smallint',1,0,0))<br />attributes_pg_statistic.append(('staop1','oid','Value_not_set','staop1-oid',1,0,0))<br />attributes_pg_statistic.append(('staop2','oid','Value_not_set','staop2-oid',1,0,0))<br />attributes_pg_statistic.append(('staop3','oid','Value_not_set','staop3-oid',1,0,0))<br />attributes_pg_statistic.append(('staop4','oid','Value_not_set','staop4-oid',1,0,0))<br />attributes_pg_statistic.append(('staop5','oid','Value_not_set','staop5-oid',1,0,0))<br />attributes_pg_statistic.append(('stanumbers1','ARRAY','Value_not_set','stanumbers1-ARRAY',1,0,0))<br />attributes_pg_statistic.append(('stanumbers2','ARRAY','Value_not_set','stanumbers2-ARRAY',1,0,0))<br />attributes_pg_statistic.append(('stanumbers3','ARRAY','Value_not_set','stanumbers3-ARRAY',1,0,0))<br />attributes_pg_statistic.append(('stanumbers4','ARRAY','Value_not_set','stanumbers4-ARRAY',1,0,0))<br />attributes_pg_statistic.append(('stanumbers5','ARRAY','Value_not_set','stanumbers5-ARRAY',1,0,0))<br />attributes_pg_statistic.append(('stavalues1','anyarray','Value_not_set','stavalues1-anyarray',1,0,0))<br />attributes_pg_statistic.append(('stavalues2','anyarray','Value_not_set','stavalues2-anyarray',1,0,0))<br />attributes_pg_statistic.append(('stavalues3','anyarray','Value_not_set','stavalues3-anyarray',1,0,0))<br />attributes_pg_statistic.append(('stavalues4','anyarray','Value_not_set','stavalues4-anyarray',1,0,0))<br />attributes_pg_statistic.append(('stavalues5','anyarray','Value_not_set','stavalues5-anyarray',1,0,0))<br />attributes_pg_type.append(('typname','name','Value_not_set','typname-name',1,0,0))<br />attributes_pg_type.append(('typnamespace','oid','Value_not_set','typnamespace-oid',1,0,0))<br />attributes_pg_type.append(('typowner','oid','Value_not_set','typowner-oid',1,0,0))<br />attributes_pg_type.append(('typlen','smallint','Value_not_set','typlen-smallint',1,0,0))<br />attributes_pg_type.append(('typbyval','boolean','Value_not_set','typbyval-boolean',1,0,0))<br />attributes_pg_type.append(('typtype','"char"','Value_not_set','typtype-"char"',1,0,0))<br />attributes_pg_type.append(('typcategory','"char"','Value_not_set','typcategory-"char"',1,0,0))<br />attributes_pg_type.append(('typispreferred','boolean','Value_not_set','typispreferred-boolean',1,0,0))<br />attributes_pg_type.append(('typisdefined','boolean','Value_not_set','typisdefined-boolean',1,0,0))<br />attributes_pg_type.append(('typdelim','"char"','Value_not_set','typdelim-"char"',1,0,0))<br />attributes_pg_type.append(('typrelid','oid','Value_not_set','typrelid-oid',1,0,0))<br />attributes_pg_type.append(('typelem','oid','Value_not_set','typelem-oid',1,0,0))<br />attributes_pg_type.append(('typarray','oid','Value_not_set','typarray-oid',1,0,0))<br />attributes_pg_type.append(('typinput','regproc','Value_not_set','typinput-regproc',1,0,0))<br />attributes_pg_type.append(('typoutput','regproc','Value_not_set','typoutput-regproc',1,0,0))<br />attributes_pg_type.append(('typreceive','regproc','Value_not_set','typreceive-regproc',1,0,0))<br />attributes_pg_type.append(('typsend','regproc','Value_not_set','typsend-regproc',1,0,0))<br />attributes_pg_type.append(('typmodin','regproc','Value_not_set','typmodin-regproc',1,0,0))<br />attributes_pg_type.append(('typmodout','regproc','Value_not_set','typmodout-regproc',1,0,0))<br />attributes_pg_type.append(('typanalyze','regproc','Value_not_set','typanalyze-regproc',1,0,0))<br />attributes_pg_type.append(('typalign','"char"','Value_not_set','typalign-"char"',1,0,0))<br />attributes_pg_type.append(('typstorage','"char"','Value_not_set','typstorage-"char"',1,0,0))<br />attributes_pg_type.append(('typnotnull','boolean','Value_not_set','typnotnull-boolean',1,0,0))<br />attributes_pg_type.append(('typbasetype','oid','Value_not_set','typbasetype-oid',1,0,0))<br />attributes_pg_type.append(('typtypmod','integer','Value_not_set','typtypmod-integer',1,0,0))<br />attributes_pg_type.append(('typndims','integer','Value_not_set','typndims-integer',1,0,0))<br />attributes_pg_type.append(('typcollation','oid','Value_not_set','typcollation-oid',1,0,0))<br />attributes_pg_type.append(('typdefaultbin','pg_node_tree','Value_not_set','typdefaultbin-pg_node_tree',1,0,0))<br />attributes_pg_type.append(('typdefault','text','Value_not_set','typdefault-text',1,0,0))<br />attributes_pg_type.append(('typacl','ARRAY','Value_not_set','typacl-ARRAY',1,0,0))<br />attributes_pg_authid.append(('rolname','name','Value_not_set','rolname-name',1,0,0))<br />attributes_pg_authid.append(('rolsuper','boolean','Value_not_set','rolsuper-boolean',1,0,0))<br />attributes_pg_authid.append(('rolinherit','boolean','Value_not_set','rolinherit-boolean',1,0,0))<br />attributes_pg_authid.append(('rolcreaterole','boolean','Value_not_set','rolcreaterole-boolean',1,0,0))<br />attributes_pg_authid.append(('rolcreatedb','boolean','Value_not_set','rolcreatedb-boolean',1,0,0))<br />attributes_pg_authid.append(('rolcatupdate','boolean','Value_not_set','rolcatupdate-boolean',1,0,0))<br />attributes_pg_authid.append(('rolcanlogin','boolean','Value_not_set','rolcanlogin-boolean',1,0,0))<br />attributes_pg_authid.append(('rolreplication','boolean','Value_not_set','rolreplication-boolean',1,0,0))<br />attributes_pg_authid.append(('rolconnlimit','integer','Value_not_set','rolconnlimit-integer',1,0,0))<br />attributes_pg_authid.append(('rolpassword','text','Value_not_set','rolpassword-text',1,0,0))<br />attributes_pg_authid.append(('rolvaliduntil','timestampwithtimezone','Value_not_set','rolvaliduntil-timestampwithtimezone',1,0,0))<br />attributes_pg_proc.append(('proname','name','Value_not_set','proname-name',1,0,0))<br />attributes_pg_proc.append(('pronamespace','oid','Value_not_set','pronamespace-oid',1,0,0))<br />attributes_pg_proc.append(('proowner','oid','Value_not_set','proowner-oid',1,0,0))<br />attributes_pg_proc.append(('prolang','oid','Value_not_set','prolang-oid',1,0,0))<br />attributes_pg_proc.append(('procost','real','Value_not_set','procost-real',1,0,0))<br />attributes_pg_proc.append(('prorows','real','Value_not_set','prorows-real',1,0,0))<br />attributes_pg_proc.append(('provariadic','oid','Value_not_set','provariadic-oid',1,0,0))<br />attributes_pg_proc.append(('protransform','regproc','Value_not_set','protransform-regproc',1,0,0))<br />attributes_pg_proc.append(('proisagg','boolean','Value_not_set','proisagg-boolean',1,0,0))<br />attributes_pg_proc.append(('proiswindow','boolean','Value_not_set','proiswindow-boolean',1,0,0))<br />attributes_pg_proc.append(('prosecdef','boolean','Value_not_set','prosecdef-boolean',1,0,0))<br />attributes_pg_proc.append(('proleakproof','boolean','Value_not_set','proleakproof-boolean',1,0,0))<br />attributes_pg_proc.append(('proisstrict','boolean','Value_not_set','proisstrict-boolean',1,0,0))<br />attributes_pg_proc.append(('proretset','boolean','Value_not_set','proretset-boolean',1,0,0))<br />attributes_pg_proc.append(('provolatile','"char"','Value_not_set','provolatile-"char"',1,0,0))<br />attributes_pg_proc.append(('pronargs','smallint','Value_not_set','pronargs-smallint',1,0,0))<br />attributes_pg_proc.append(('pronargdefaults','smallint','Value_not_set','pronargdefaults-smallint',1,0,0))<br />attributes_pg_proc.append(('prorettype','oid','Value_not_set','prorettype-oid',1,0,0))<br />attributes_pg_proc.append(('proargtypes','ARRAY','Value_not_set','proargtypes-ARRAY',1,0,0))<br />attributes_pg_proc.append(('proallargtypes','ARRAY','Value_not_set','proallargtypes-ARRAY',1,0,0))<br />attributes_pg_proc.append(('proargmodes','ARRAY','Value_not_set','proargmodes-ARRAY',1,0,0))<br />attributes_pg_proc.append(('proargnames','ARRAY','Value_not_set','proargnames-ARRAY',1,0,0))<br />attributes_pg_proc.append(('proargdefaults','pg_node_tree','Value_not_set','proargdefaults-pg_node_tree',1,0,0))<br />attributes_pg_proc.append(('prosrc','text','Value_not_set','prosrc-text',1,0,0))<br />attributes_pg_proc.append(('probin','text','Value_not_set','probin-text',1,0,0))<br />attributes_pg_proc.append(('proconfig','ARRAY','Value_not_set','proconfig-ARRAY',1,0,0))<br />attributes_pg_proc.append(('proacl','ARRAY','Value_not_set','proacl-ARRAY',1,0,0))<br />attributes_pg_class.append(('relname','name','Value_not_set','relname-name',1,0,0))<br />attributes_pg_class.append(('relnamespace','oid','Value_not_set','relnamespace-oid',1,0,0))<br />attributes_pg_class.append(('reltype','oid','Value_not_set','reltype-oid',1,0,0))<br />attributes_pg_class.append(('reloftype','oid','Value_not_set','reloftype-oid',1,0,0))<br />attributes_pg_class.append(('relowner','oid','Value_not_set','relowner-oid',1,0,0))<br />attributes_pg_class.append(('relam','oid','Value_not_set','relam-oid',1,0,0))<br />attributes_pg_class.append(('relfilenode','oid','Value_not_set','relfilenode-oid',1,0,0))<br />attributes_pg_class.append(('reltablespace','oid','Value_not_set','reltablespace-oid',1,0,0))<br />attributes_pg_class.append(('relpages','integer','Value_not_set','relpages-integer',1,0,0))<br />attributes_pg_class.append(('reltuples','real','Value_not_set','reltuples-real',1,0,0))<br />attributes_pg_class.append(('relallvisible','integer','Value_not_set','relallvisible-integer',1,0,0))<br />attributes_pg_class.append(('reltoastrelid','oid','Value_not_set','reltoastrelid-oid',1,0,0))<br />attributes_pg_class.append(('reltoastidxid','oid','Value_not_set','reltoastidxid-oid',1,0,0))<br />attributes_pg_class.append(('relhasindex','boolean','Value_not_set','relhasindex-boolean',1,0,0))<br />attributes_pg_class.append(('relisshared','boolean','Value_not_set','relisshared-boolean',1,0,0))<br />attributes_pg_class.append(('relpersistence','"char"','Value_not_set','relpersistence-"char"',1,0,0))<br />attributes_pg_class.append(('relkind','"char"','Value_not_set','relkind-"char"',1,0,0))<br />attributes_pg_class.append(('relnatts','smallint','Value_not_set','relnatts-smallint',1,0,0))<br />attributes_pg_class.append(('relchecks','smallint','Value_not_set','relchecks-smallint',1,0,0))<br />attributes_pg_class.append(('relhasoids','boolean','Value_not_set','relhasoids-boolean',1,0,0))<br />attributes_pg_class.append(('relhaspkey','boolean','Value_not_set','relhaspkey-boolean',1,0,0))<br />attributes_pg_class.append(('relhasrules','boolean','Value_not_set','relhasrules-boolean',1,0,0))<br />attributes_pg_class.append(('relhastriggers','boolean','Value_not_set','relhastriggers-boolean',1,0,0))<br />attributes_pg_class.append(('relhassubclass','boolean','Value_not_set','relhassubclass-boolean',1,0,0))<br />attributes_pg_class.append(('relispopulated','boolean','Value_not_set','relispopulated-boolean',1,0,0))<br />attributes_pg_class.append(('relfrozenxid','xid','Value_not_set','relfrozenxid-xid',1,0,0))<br />attributes_pg_class.append(('relminmxid','xid','Value_not_set','relminmxid-xid',1,0,0))<br />attributes_pg_class.append(('relacl','ARRAY','Value_not_set','relacl-ARRAY',1,0,0))<br />attributes_pg_class.append(('reloptions','ARRAY','Value_not_set','reloptions-ARRAY',1,0,0))<br />attributes_pg_user_mapping.append(('umuser','oid','Value_not_set','umuser-oid',1,0,0))<br />attributes_pg_user_mapping.append(('umserver','oid','Value_not_set','umserver-oid',1,0,0))<br />attributes_pg_user_mapping.append(('umoptions','ARRAY','Value_not_set','umoptions-ARRAY',1,0,0))<br />attributes_pg_attribute.append(('attrelid','oid','Value_not_set','attrelid-oid',1,0,0))<br />attributes_pg_attribute.append(('attname','name','Value_not_set','attname-name',1,0,0))<br />attributes_pg_attribute.append(('atttypid','oid','Value_not_set','atttypid-oid',1,0,0))<br />attributes_pg_attribute.append(('attstattarget','integer','Value_not_set','attstattarget-integer',1,0,0))<br />attributes_pg_attribute.append(('attlen','smallint','Value_not_set','attlen-smallint',1,0,0))<br />attributes_pg_attribute.append(('attnum','smallint','Value_not_set','attnum-smallint',1,0,0))<br />attributes_pg_attribute.append(('attndims','integer','Value_not_set','attndims-integer',1,0,0))<br />attributes_pg_attribute.append(('attcacheoff','integer','Value_not_set','attcacheoff-integer',1,0,0))<br />attributes_pg_attribute.append(('atttypmod','integer','Value_not_set','atttypmod-integer',1,0,0))<br />attributes_pg_attribute.append(('attbyval','boolean','Value_not_set','attbyval-boolean',1,0,0))<br />attributes_pg_attribute.append(('attstorage','"char"','Value_not_set','attstorage-"char"',1,0,0))<br />attributes_pg_attribute.append(('attalign','"char"','Value_not_set','attalign-"char"',1,0,0))<br />attributes_pg_attribute.append(('attnotnull','boolean','Value_not_set','attnotnull-boolean',1,0,0))<br />attributes_pg_attribute.append(('atthasdef','boolean','Value_not_set','atthasdef-boolean',1,0,0))<br />attributes_pg_attribute.append(('attisdropped','boolean','Value_not_set','attisdropped-boolean',1,0,0))<br />attributes_pg_attribute.append(('attislocal','boolean','Value_not_set','attislocal-boolean',1,0,0))<br />attributes_pg_attribute.append(('attinhcount','integer','Value_not_set','attinhcount-integer',1,0,0))<br />attributes_pg_attribute.append(('attcollation','oid','Value_not_set','attcollation-oid',1,0,0))<br />attributes_pg_attribute.append(('attacl','ARRAY','Value_not_set','attacl-ARRAY',1,0,0))<br />attributes_pg_attribute.append(('attoptions','ARRAY','Value_not_set','attoptions-ARRAY',1,0,0))<br />attributes_pg_attribute.append(('attfdwoptions','ARRAY','Value_not_set','attfdwoptions-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conname','name','Value_not_set','conname-name',1,0,0))<br />attributes_pg_constraint.append(('connamespace','oid','Value_not_set','connamespace-oid',1,0,0))<br />attributes_pg_constraint.append(('contype','"char"','Value_not_set','contype-"char"',1,0,0))<br />attributes_pg_constraint.append(('condeferrable','boolean','Value_not_set','condeferrable-boolean',1,0,0))<br />attributes_pg_constraint.append(('condeferred','boolean','Value_not_set','condeferred-boolean',1,0,0))<br />attributes_pg_constraint.append(('convalidated','boolean','Value_not_set','convalidated-boolean',1,0,0))<br />attributes_pg_constraint.append(('conrelid','oid','Value_not_set','conrelid-oid',1,0,0))<br />attributes_pg_constraint.append(('contypid','oid','Value_not_set','contypid-oid',1,0,0))<br />attributes_pg_constraint.append(('conindid','oid','Value_not_set','conindid-oid',1,0,0))<br />attributes_pg_constraint.append(('confrelid','oid','Value_not_set','confrelid-oid',1,0,0))<br />attributes_pg_constraint.append(('confupdtype','"char"','Value_not_set','confupdtype-"char"',1,0,0))<br />attributes_pg_constraint.append(('confdeltype','"char"','Value_not_set','confdeltype-"char"',1,0,0))<br />attributes_pg_constraint.append(('confmatchtype','"char"','Value_not_set','confmatchtype-"char"',1,0,0))<br />attributes_pg_constraint.append(('conislocal','boolean','Value_not_set','conislocal-boolean',1,0,0))<br />attributes_pg_constraint.append(('coninhcount','integer','Value_not_set','coninhcount-integer',1,0,0))<br />attributes_pg_constraint.append(('connoinherit','boolean','Value_not_set','connoinherit-boolean',1,0,0))<br />attributes_pg_constraint.append(('conkey','ARRAY','Value_not_set','conkey-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('confkey','ARRAY','Value_not_set','confkey-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conpfeqop','ARRAY','Value_not_set','conpfeqop-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conppeqop','ARRAY','Value_not_set','conppeqop-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conffeqop','ARRAY','Value_not_set','conffeqop-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conexclop','ARRAY','Value_not_set','conexclop-ARRAY',1,0,0))<br />attributes_pg_constraint.append(('conbin','pg_node_tree','Value_not_set','conbin-pg_node_tree',1,0,0))<br />attributes_pg_constraint.append(('consrc','text','Value_not_set','consrc-text',1,0,0))<br />attributes_pg_inherits.append(('inhrelid','oid','Value_not_set','inhrelid-oid',1,0,0))<br />attributes_pg_inherits.append(('inhparent','oid','Value_not_set','inhparent-oid',1,0,0))<br />attributes_pg_inherits.append(('inhseqno','integer','Value_not_set','inhseqno-integer',1,0,0))<br />attributes_pg_index.append(('indexrelid','oid','Value_not_set','indexrelid-oid',1,0,0))<br />attributes_pg_index.append(('indrelid','oid','Value_not_set','indrelid-oid',1,0,0))<br />attributes_pg_index.append(('indnatts','smallint','Value_not_set','indnatts-smallint',1,0,0))<br />attributes_pg_index.append(('indisunique','boolean','Value_not_set','indisunique-boolean',1,0,0))<br />attributes_pg_index.append(('indisprimary','boolean','Value_not_set','indisprimary-boolean',1,0,0))<br />attributes_pg_index.append(('indisexclusion','boolean','Value_not_set','indisexclusion-boolean',1,0,0))<br />attributes_pg_index.append(('indimmediate','boolean','Value_not_set','indimmediate-boolean',1,0,0))<br />attributes_pg_index.append(('indisclustered','boolean','Value_not_set','indisclustered-boolean',1,0,0))<br />attributes_pg_index.append(('indisvalid','boolean','Value_not_set','indisvalid-boolean',1,0,0))<br />attributes_pg_index.append(('indcheckxmin','boolean','Value_not_set','indcheckxmin-boolean',1,0,0))<br />attributes_pg_index.append(('indisready','boolean','Value_not_set','indisready-boolean',1,0,0))<br />attributes_pg_index.append(('indislive','boolean','Value_not_set','indislive-boolean',1,0,0))<br />attributes_pg_index.append(('indkey','ARRAY','Value_not_set','indkey-ARRAY',1,0,0))<br />attributes_pg_index.append(('indcollation','ARRAY','Value_not_set','indcollation-ARRAY',1,0,0))<br />attributes_pg_index.append(('indclass','ARRAY','Value_not_set','indclass-ARRAY',1,0,0))<br />attributes_pg_index.append(('indoption','ARRAY','Value_not_set','indoption-ARRAY',1,0,0))<br />attributes_pg_index.append(('indexprs','pg_node_tree','Value_not_set','indexprs-pg_node_tree',1,0,0))<br />attributes_pg_index.append(('indpred','pg_node_tree','Value_not_set','indpred-pg_node_tree',1,0,0))<br />attributes_pg_operator.append(('oprname','name','Value_not_set','oprname-name',1,0,0))<br />attributes_pg_operator.append(('oprnamespace','oid','Value_not_set','oprnamespace-oid',1,0,0))<br />attributes_pg_operator.append(('oprowner','oid','Value_not_set','oprowner-oid',1,0,0))<br />attributes_pg_operator.append(('oprkind','"char"','Value_not_set','oprkind-"char"',1,0,0))<br />attributes_pg_operator.append(('oprcanmerge','boolean','Value_not_set','oprcanmerge-boolean',1,0,0))<br />attributes_pg_operator.append(('oprcanhash','boolean','Value_not_set','oprcanhash-boolean',1,0,0))<br />attributes_pg_operator.append(('oprleft','oid','Value_not_set','oprleft-oid',1,0,0))<br />attributes_pg_operator.append(('oprright','oid','Value_not_set','oprright-oid',1,0,0))<br />attributes_pg_operator.append(('oprresult','oid','Value_not_set','oprresult-oid',1,0,0))<br />attributes_pg_operator.append(('oprcom','oid','Value_not_set','oprcom-oid',1,0,0))<br />attributes_pg_operator.append(('oprnegate','oid','Value_not_set','oprnegate-oid',1,0,0))<br />attributes_pg_operator.append(('oprcode','regproc','Value_not_set','oprcode-regproc',1,0,0))<br />attributes_pg_operator.append(('oprrest','regproc','Value_not_set','oprrest-regproc',1,0,0))<br />attributes_pg_operator.append(('oprjoin','regproc','Value_not_set','oprjoin-regproc',1,0,0))<br />attributes_pg_opfamily.append(('opfmethod','oid','Value_not_set','opfmethod-oid',1,0,0))<br />attributes_pg_opfamily.append(('opfname','name','Value_not_set','opfname-name',1,0,0))<br />attributes_pg_opfamily.append(('opfnamespace','oid','Value_not_set','opfnamespace-oid',1,0,0))<br />attributes_pg_opfamily.append(('opfowner','oid','Value_not_set','opfowner-oid',1,0,0))<br />attributes_pg_opclass.append(('opcmethod','oid','Value_not_set','opcmethod-oid',1,0,0))<br />attributes_pg_opclass.append(('opcname','name','Value_not_set','opcname-name',1,0,0))<br />attributes_pg_opclass.append(('opcnamespace','oid','Value_not_set','opcnamespace-oid',1,0,0))<br />attributes_pg_opclass.append(('opcowner','oid','Value_not_set','opcowner-oid',1,0,0))<br />attributes_pg_opclass.append(('opcfamily','oid','Value_not_set','opcfamily-oid',1,0,0))<br />attributes_pg_opclass.append(('opcintype','oid','Value_not_set','opcintype-oid',1,0,0))<br />attributes_pg_opclass.append(('opcdefault','boolean','Value_not_set','opcdefault-boolean',1,0,0))<br />attributes_pg_opclass.append(('opckeytype','oid','Value_not_set','opckeytype-oid',1,0,0))<br />attributes_pg_am.append(('amname','name','Value_not_set','amname-name',1,0,0))<br />attributes_pg_am.append(('amstrategies','smallint','Value_not_set','amstrategies-smallint',1,0,0))<br />attributes_pg_am.append(('amsupport','smallint','Value_not_set','amsupport-smallint',1,0,0))<br />attributes_pg_am.append(('amcanorder','boolean','Value_not_set','amcanorder-boolean',1,0,0))<br />attributes_pg_am.append(('amcanorderbyop','boolean','Value_not_set','amcanorderbyop-boolean',1,0,0))<br />attributes_pg_am.append(('amcanbackward','boolean','Value_not_set','amcanbackward-boolean',1,0,0))<br />attributes_pg_am.append(('amcanunique','boolean','Value_not_set','amcanunique-boolean',1,0,0))<br />attributes_pg_am.append(('amcanmulticol','boolean','Value_not_set','amcanmulticol-boolean',1,0,0))<br />attributes_pg_am.append(('amoptionalkey','boolean','Value_not_set','amoptionalkey-boolean',1,0,0))<br />attributes_pg_am.append(('amsearcharray','boolean','Value_not_set','amsearcharray-boolean',1,0,0))<br />attributes_pg_am.append(('amsearchnulls','boolean','Value_not_set','amsearchnulls-boolean',1,0,0))<br />attributes_pg_am.append(('amstorage','boolean','Value_not_set','amstorage-boolean',1,0,0))<br />attributes_pg_am.append(('amclusterable','boolean','Value_not_set','amclusterable-boolean',1,0,0))<br />attributes_pg_am.append(('ampredlocks','boolean','Value_not_set','ampredlocks-boolean',1,0,0))<br />attributes_pg_am.append(('amkeytype','oid','Value_not_set','amkeytype-oid',1,0,0))<br />attributes_pg_am.append(('aminsert','regproc','Value_not_set','aminsert-regproc',1,0,0))<br />attributes_pg_am.append(('ambeginscan','regproc','Value_not_set','ambeginscan-regproc',1,0,0))<br />attributes_pg_am.append(('amgettuple','regproc','Value_not_set','amgettuple-regproc',1,0,0))<br />attributes_pg_am.append(('amgetbitmap','regproc','Value_not_set','amgetbitmap-regproc',1,0,0))<br />attributes_pg_am.append(('amrescan','regproc','Value_not_set','amrescan-regproc',1,0,0))<br />attributes_pg_am.append(('amendscan','regproc','Value_not_set','amendscan-regproc',1,0,0))<br />attributes_pg_am.append(('ammarkpos','regproc','Value_not_set','ammarkpos-regproc',1,0,0))<br />attributes_pg_am.append(('amrestrpos','regproc','Value_not_set','amrestrpos-regproc',1,0,0))<br />attributes_pg_am.append(('ambuild','regproc','Value_not_set','ambuild-regproc',1,0,0))<br />attributes_pg_am.append(('ambuildempty','regproc','Value_not_set','ambuildempty-regproc',1,0,0))<br />attributes_pg_am.append(('ambulkdelete','regproc','Value_not_set','ambulkdelete-regproc',1,0,0))<br />attributes_pg_am.append(('amvacuumcleanup','regproc','Value_not_set','amvacuumcleanup-regproc',1,0,0))<br />attributes_pg_am.append(('amcanreturn','regproc','Value_not_set','amcanreturn-regproc',1,0,0))<br />attributes_pg_am.append(('amcostestimate','regproc','Value_not_set','amcostestimate-regproc',1,0,0))<br />attributes_pg_am.append(('amoptions','regproc','Value_not_set','amoptions-regproc',1,0,0))<br />attributes_pg_amop.append(('amopfamily','oid','Value_not_set','amopfamily-oid',1,0,0))<br />attributes_pg_amop.append(('amoplefttype','oid','Value_not_set','amoplefttype-oid',1,0,0))<br />attributes_pg_amop.append(('amoprighttype','oid','Value_not_set','amoprighttype-oid',1,0,0))<br />attributes_pg_amop.append(('amopstrategy','smallint','Value_not_set','amopstrategy-smallint',1,0,0))<br />attributes_pg_amop.append(('amoppurpose','"char"','Value_not_set','amoppurpose-"char"',1,0,0))<br />attributes_pg_amop.append(('amopopr','oid','Value_not_set','amopopr-oid',1,0,0))<br />attributes_pg_amop.append(('amopmethod','oid','Value_not_set','amopmethod-oid',1,0,0))<br />attributes_pg_amop.append(('amopsortfamily','oid','Value_not_set','amopsortfamily-oid',1,0,0))<br />attributes_pg_amproc.append(('amprocfamily','oid','Value_not_set','amprocfamily-oid',1,0,0))<br />attributes_pg_amproc.append(('amproclefttype','oid','Value_not_set','amproclefttype-oid',1,0,0))<br />attributes_pg_amproc.append(('amprocrighttype','oid','Value_not_set','amprocrighttype-oid',1,0,0))<br />attributes_pg_amproc.append(('amprocnum','smallint','Value_not_set','amprocnum-smallint',1,0,0))<br />attributes_pg_amproc.append(('amproc','regproc','Value_not_set','amproc-regproc',1,0,0))<br />attributes_pg_language.append(('lanname','name','Value_not_set','lanname-name',1,0,0))<br />attributes_pg_language.append(('lanowner','oid','Value_not_set','lanowner-oid',1,0,0))<br />attributes_pg_language.append(('lanispl','boolean','Value_not_set','lanispl-boolean',1,0,0))<br />attributes_pg_language.append(('lanpltrusted','boolean','Value_not_set','lanpltrusted-boolean',1,0,0))<br />attributes_pg_language.append(('lanplcallfoid','oid','Value_not_set','lanplcallfoid-oid',1,0,0))<br />attributes_pg_language.append(('laninline','oid','Value_not_set','laninline-oid',1,0,0))<br />attributes_pg_language.append(('lanvalidator','oid','Value_not_set','lanvalidator-oid',1,0,0))<br />attributes_pg_language.append(('lanacl','ARRAY','Value_not_set','lanacl-ARRAY',1,0,0))<br />attributes_pg_largeobject_metadata.append(('lomowner','oid','Value_not_set','lomowner-oid',1,0,0))<br />attributes_pg_largeobject_metadata.append(('lomacl','ARRAY','Value_not_set','lomacl-ARRAY',1,0,0))<br />attributes_pg_aggregate.append(('aggfnoid','regproc','Value_not_set','aggfnoid-regproc',1,0,0))<br />attributes_pg_aggregate.append(('aggtransfn','regproc','Value_not_set','aggtransfn-regproc',1,0,0))<br />attributes_pg_aggregate.append(('aggfinalfn','regproc','Value_not_set','aggfinalfn-regproc',1,0,0))<br />attributes_pg_aggregate.append(('aggsortop','oid','Value_not_set','aggsortop-oid',1,0,0))<br />attributes_pg_aggregate.append(('aggtranstype','oid','Value_not_set','aggtranstype-oid',1,0,0))<br />attributes_pg_aggregate.append(('agginitval','text','Value_not_set','agginitval-text',1,0,0))<br />attributes_pg_database.append(('datname','name','Value_not_set','datname-name',1,0,0))<br />attributes_pg_database.append(('datdba','oid','Value_not_set','datdba-oid',1,0,0))<br />attributes_pg_database.append(('encoding','integer','Value_not_set','encoding-integer',1,0,0))<br />attributes_pg_database.append(('datcollate','name','Value_not_set','datcollate-name',1,0,0))<br />attributes_pg_database.append(('datctype','name','Value_not_set','datctype-name',1,0,0))<br />attributes_pg_database.append(('datistemplate','boolean','Value_not_set','datistemplate-boolean',1,0,0))<br />attributes_pg_database.append(('datallowconn','boolean','Value_not_set','datallowconn-boolean',1,0,0))<br />attributes_pg_database.append(('datconnlimit','integer','Value_not_set','datconnlimit-integer',1,0,0))<br />attributes_pg_database.append(('datlastsysoid','oid','Value_not_set','datlastsysoid-oid',1,0,0))<br />attributes_pg_database.append(('datfrozenxid','xid','Value_not_set','datfrozenxid-xid',1,0,0))<br />attributes_pg_database.append(('datminmxid','xid','Value_not_set','datminmxid-xid',1,0,0))<br />attributes_pg_database.append(('dattablespace','oid','Value_not_set','dattablespace-oid',1,0,0))<br />attributes_pg_database.append(('datacl','ARRAY','Value_not_set','datacl-ARRAY',1,0,0))<br />attributes_pg_trigger.append(('tgrelid','oid','Value_not_set','tgrelid-oid',1,0,0))<br />attributes_pg_trigger.append(('tgname','name','Value_not_set','tgname-name',1,0,0))<br />attributes_pg_trigger.append(('tgfoid','oid','Value_not_set','tgfoid-oid',1,0,0))<br />attributes_pg_trigger.append(('tgtype','smallint','Value_not_set','tgtype-smallint',1,0,0))<br />attributes_pg_trigger.append(('tgenabled','"char"','Value_not_set','tgenabled-"char"',1,0,0))<br />attributes_pg_trigger.append(('tgisinternal','boolean','Value_not_set','tgisinternal-boolean',1,0,0))<br />attributes_pg_trigger.append(('tgconstrrelid','oid','Value_not_set','tgconstrrelid-oid',1,0,0))<br />attributes_pg_trigger.append(('tgconstrindid','oid','Value_not_set','tgconstrindid-oid',1,0,0))<br />attributes_pg_trigger.append(('tgconstraint','oid','Value_not_set','tgconstraint-oid',1,0,0))<br />attributes_pg_trigger.append(('tgdeferrable','boolean','Value_not_set','tgdeferrable-boolean',1,0,0))<br />attributes_pg_trigger.append(('tginitdeferred','boolean','Value_not_set','tginitdeferred-boolean',1,0,0))<br />attributes_pg_trigger.append(('tgnargs','smallint','Value_not_set','tgnargs-smallint',1,0,0))<br />attributes_pg_trigger.append(('tgattr','ARRAY','Value_not_set','tgattr-ARRAY',1,0,0))<br />attributes_pg_trigger.append(('tgargs','bytea','Value_not_set','tgargs-bytea',1,0,0))<br />attributes_pg_trigger.append(('tgqual','pg_node_tree','Value_not_set','tgqual-pg_node_tree',1,0,0))<br />attributes_pg_event_trigger.append(('evtname','name','Value_not_set','evtname-name',1,0,0))<br />attributes_pg_event_trigger.append(('evtevent','name','Value_not_set','evtevent-name',1,0,0))<br />attributes_pg_event_trigger.append(('evtowner','oid','Value_not_set','evtowner-oid',1,0,0))<br />attributes_pg_event_trigger.append(('evtfoid','oid','Value_not_set','evtfoid-oid',1,0,0))<br />attributes_pg_event_trigger.append(('evtenabled','"char"','Value_not_set','evtenabled-"char"',1,0,0))<br />attributes_pg_event_trigger.append(('evttags','ARRAY','Value_not_set','evttags-ARRAY',1,0,0))<br />attributes_pg_description.append(('objoid','oid','Value_not_set','objoid-oid',1,0,0))<br />attributes_pg_description.append(('classoid','oid','Value_not_set','classoid-oid',1,0,0))<br />attributes_pg_description.append(('objsubid','integer','Value_not_set','objsubid-integer',1,0,0))<br />attributes_pg_description.append(('description','text','Value_not_set','description-text',1,0,0))<br />attributes_pg_cast.append(('castsource','oid','Value_not_set','castsource-oid',1,0,0))<br />attributes_pg_cast.append(('casttarget','oid','Value_not_set','casttarget-oid',1,0,0))<br />attributes_pg_cast.append(('castfunc','oid','Value_not_set','castfunc-oid',1,0,0))<br />attributes_pg_cast.append(('castcontext','"char"','Value_not_set','castcontext-"char"',1,0,0))<br />attributes_pg_cast.append(('castmethod','"char"','Value_not_set','castmethod-"char"',1,0,0))<br />attributes_pg_enum.append(('enumtypid','oid','Value_not_set','enumtypid-oid',1,0,0))<br />attributes_pg_enum.append(('enumsortorder','real','Value_not_set','enumsortorder-real',1,0,0))<br />attributes_pg_enum.append(('enumlabel','name','Value_not_set','enumlabel-name',1,0,0))<br />attributes_pg_conversion.append(('conname','name','Value_not_set','conname-name',1,0,0))<br />attributes_pg_conversion.append(('connamespace','oid','Value_not_set','connamespace-oid',1,0,0))<br />attributes_pg_conversion.append(('conowner','oid','Value_not_set','conowner-oid',1,0,0))<br />attributes_pg_conversion.append(('conforencoding','integer','Value_not_set','conforencoding-integer',1,0,0))<br />attributes_pg_conversion.append(('contoencoding','integer','Value_not_set','contoencoding-integer',1,0,0))<br />attributes_pg_conversion.append(('conproc','regproc','Value_not_set','conproc-regproc',1,0,0))<br />attributes_pg_conversion.append(('condefault','boolean','Value_not_set','condefault-boolean',1,0,0))<br />attributes_pg_depend.append(('classid','oid','Value_not_set','classid-oid',1,0,0))<br />attributes_pg_depend.append(('objid','oid','Value_not_set','objid-oid',1,0,0))<br />attributes_pg_depend.append(('objsubid','integer','Value_not_set','objsubid-integer',1,0,0))<br />attributes_pg_depend.append(('refclassid','oid','Value_not_set','refclassid-oid',1,0,0))<br />attributes_pg_depend.append(('refobjid','oid','Value_not_set','refobjid-oid',1,0,0))<br />attributes_pg_depend.append(('refobjsubid','integer','Value_not_set','refobjsubid-integer',1,0,0))<br />attributes_pg_depend.append(('deptype','"char"','Value_not_set','deptype-"char"',1,0,0))<br />attributes_pg_db_role_setting.append(('setdatabase','oid','Value_not_set','setdatabase-oid',1,0,0))<br />attributes_pg_db_role_setting.append(('setrole','oid','Value_not_set','setrole-oid',1,0,0))<br />attributes_pg_db_role_setting.append(('setconfig','ARRAY','Value_not_set','setconfig-ARRAY',1,0,0))<br />attributes_pg_tablespace.append(('spcname','name','Value_not_set','spcname-name',1,0,0))<br />attributes_pg_tablespace.append(('spcowner','oid','Value_not_set','spcowner-oid',1,0,0))<br />attributes_pg_tablespace.append(('spcacl','ARRAY','Value_not_set','spcacl-ARRAY',1,0,0))<br />attributes_pg_tablespace.append(('spcoptions','ARRAY','Value_not_set','spcoptions-ARRAY',1,0,0))<br />attributes_pg_pltemplate.append(('tmplname','name','Value_not_set','tmplname-name',1,0,0))<br />attributes_pg_pltemplate.append(('tmpltrusted','boolean','Value_not_set','tmpltrusted-boolean',1,0,0))<br />attributes_pg_pltemplate.append(('tmpldbacreate','boolean','Value_not_set','tmpldbacreate-boolean',1,0,0))<br />attributes_pg_pltemplate.append(('tmplhandler','text','Value_not_set','tmplhandler-text',1,0,0))<br />attributes_pg_pltemplate.append(('tmplinline','text','Value_not_set','tmplinline-text',1,0,0))<br />attributes_pg_pltemplate.append(('tmplvalidator','text','Value_not_set','tmplvalidator-text',1,0,0))<br />attributes_pg_pltemplate.append(('tmpllibrary','text','Value_not_set','tmpllibrary-text',1,0,0))<br />attributes_pg_pltemplate.append(('tmplacl','ARRAY','Value_not_set','tmplacl-ARRAY',1,0,0))<br />attributes_pg_auth_members.append(('roleid','oid','Value_not_set','roleid-oid',1,0,0))<br />attributes_pg_auth_members.append(('member','oid','Value_not_set','member-oid',1,0,0))<br />attributes_pg_auth_members.append(('grantor','oid','Value_not_set','grantor-oid',1,0,0))<br />attributes_pg_auth_members.append(('admin_option','boolean','Value_not_set','admin_option-boolean',1,0,0))<br />attributes_pg_shdepend.append(('dbid','oid','Value_not_set','dbid-oid',1,0,0))<br />attributes_pg_shdepend.append(('classid','oid','Value_not_set','classid-oid',1,0,0))<br />attributes_pg_shdepend.append(('objid','oid','Value_not_set','objid-oid',1,0,0))<br />attributes_pg_shdepend.append(('objsubid','integer','Value_not_set','objsubid-integer',1,0,0))<br />attributes_pg_shdepend.append(('refclassid','oid','Value_not_set','refclassid-oid',1,0,0))<br />attributes_pg_shdepend.append(('refobjid','oid','Value_not_set','refobjid-oid',1,0,0))<br />attributes_pg_shdepend.append(('deptype','"char"','Value_not_set','deptype-"char"',1,0,0))<br />attributes_pg_shdescription.append(('objoid','oid','Value_not_set','objoid-oid',1,0,0))<br />attributes_pg_shdescription.append(('classoid','oid','Value_not_set','classoid-oid',1,0,0))<br />attributes_pg_shdescription.append(('description','text','Value_not_set','description-text',1,0,0))<br />attributes_pg_ts_config.append(('cfgname','name','Value_not_set','cfgname-name',1,0,0))<br />attributes_pg_ts_config.append(('cfgnamespace','oid','Value_not_set','cfgnamespace-oid',1,0,0))<br />attributes_pg_ts_config.append(('cfgowner','oid','Value_not_set','cfgowner-oid',1,0,0))<br />attributes_pg_ts_config.append(('cfgparser','oid','Value_not_set','cfgparser-oid',1,0,0))<br />attributes_pg_ts_config_map.append(('mapcfg','oid','Value_not_set','mapcfg-oid',1,0,0))<br />attributes_pg_ts_config_map.append(('maptokentype','integer','Value_not_set','maptokentype-integer',1,0,0))<br />attributes_pg_ts_config_map.append(('mapseqno','integer','Value_not_set','mapseqno-integer',1,0,0))<br />attributes_pg_ts_config_map.append(('mapdict','oid','Value_not_set','mapdict-oid',1,0,0))<br />attributes_pg_ts_dict.append(('dictname','name','Value_not_set','dictname-name',1,0,0))<br />attributes_pg_ts_dict.append(('dictnamespace','oid','Value_not_set','dictnamespace-oid',1,0,0))<br />attributes_pg_ts_dict.append(('dictowner','oid','Value_not_set','dictowner-oid',1,0,0))<br />attributes_pg_ts_dict.append(('dicttemplate','oid','Value_not_set','dicttemplate-oid',1,0,0))<br />attributes_pg_ts_dict.append(('dictinitoption','text','Value_not_set','dictinitoption-text',1,0,0))<br />attributes_pg_ts_parser.append(('prsname','name','Value_not_set','prsname-name',1,0,0))<br />attributes_pg_ts_parser.append(('prsnamespace','oid','Value_not_set','prsnamespace-oid',1,0,0))<br />attributes_pg_ts_parser.append(('prsstart','regproc','Value_not_set','prsstart-regproc',1,0,0))<br />attributes_pg_ts_parser.append(('prstoken','regproc','Value_not_set','prstoken-regproc',1,0,0))<br />attributes_pg_ts_parser.append(('prsend','regproc','Value_not_set','prsend-regproc',1,0,0))<br />attributes_pg_ts_parser.append(('prsheadline','regproc','Value_not_set','prsheadline-regproc',1,0,0))<br />attributes_pg_ts_parser.append(('prslextype','regproc','Value_not_set','prslextype-regproc',1,0,0))<br />attributes_pg_ts_template.append(('tmplname','name','Value_not_set','tmplname-name',1,0,0))<br />attributes_pg_ts_template.append(('tmplnamespace','oid','Value_not_set','tmplnamespace-oid',1,0,0))<br />attributes_pg_ts_template.append(('tmplinit','regproc','Value_not_set','tmplinit-regproc',1,0,0))<br />attributes_pg_ts_template.append(('tmpllexize','regproc','Value_not_set','tmpllexize-regproc',1,0,0))<br />attributes_pg_extension.append(('extname','name','Value_not_set','extname-name',1,0,0))<br />attributes_pg_extension.append(('extowner','oid','Value_not_set','extowner-oid',1,0,0))<br />attributes_pg_extension.append(('extnamespace','oid','Value_not_set','extnamespace-oid',1,0,0))<br />attributes_pg_extension.append(('extrelocatable','boolean','Value_not_set','extrelocatable-boolean',1,0,0))<br />attributes_pg_extension.append(('extversion','text','Value_not_set','extversion-text',1,0,0))<br />attributes_pg_extension.append(('extconfig','ARRAY','Value_not_set','extconfig-ARRAY',1,0,0))<br />attributes_pg_extension.append(('extcondition','ARRAY','Value_not_set','extcondition-ARRAY',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwname','name','Value_not_set','fdwname-name',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwowner','oid','Value_not_set','fdwowner-oid',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwhandler','oid','Value_not_set','fdwhandler-oid',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwvalidator','oid','Value_not_set','fdwvalidator-oid',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwacl','ARRAY','Value_not_set','fdwacl-ARRAY',1,0,0))<br />attributes_pg_foreign_data_wrapper.append(('fdwoptions','ARRAY','Value_not_set','fdwoptions-ARRAY',1,0,0))<br />attributes_pg_foreign_server.append(('srvname','name','Value_not_set','srvname-name',1,0,0))<br />attributes_pg_foreign_server.append(('srvowner','oid','Value_not_set','srvowner-oid',1,0,0))<br />attributes_pg_foreign_server.append(('srvfdw','oid','Value_not_set','srvfdw-oid',1,0,0))<br />attributes_pg_foreign_server.append(('srvtype','text','Value_not_set','srvtype-text',1,0,0))<br />attributes_pg_foreign_server.append(('srvversion','text','Value_not_set','srvversion-text',1,0,0))<br />attributes_pg_foreign_server.append(('srvacl','ARRAY','Value_not_set','srvacl-ARRAY',1,0,0))<br />attributes_pg_foreign_server.append(('srvoptions','ARRAY','Value_not_set','srvoptions-ARRAY',1,0,0))<br />attributes_pg_foreign_table.append(('ftrelid','oid','Value_not_set','ftrelid-oid',1,0,0))<br />attributes_pg_foreign_table.append(('ftserver','oid','Value_not_set','ftserver-oid',1,0,0))<br />attributes_pg_foreign_table.append(('ftoptions','ARRAY','Value_not_set','ftoptions-ARRAY',1,0,0))<br />attributes_pg_default_acl.append(('defaclrole','oid','Value_not_set','defaclrole-oid',1,0,0))<br />attributes_pg_default_acl.append(('defaclnamespace','oid','Value_not_set','defaclnamespace-oid',1,0,0))<br />attributes_pg_default_acl.append(('defaclobjtype','"char"','Value_not_set','defaclobjtype-"char"',1,0,0))<br />attributes_pg_default_acl.append(('defaclacl','ARRAY','Value_not_set','defaclacl-ARRAY',1,0,0))<br />attributes_pg_seclabel.append(('objoid','oid','Value_not_set','objoid-oid',1,0,0))<br />attributes_pg_seclabel.append(('classoid','oid','Value_not_set','classoid-oid',1,0,0))<br />attributes_pg_seclabel.append(('objsubid','integer','Value_not_set','objsubid-integer',1,0,0))<br />attributes_pg_seclabel.append(('provider','text','Value_not_set','provider-text',1,0,0))<br />attributes_pg_seclabel.append(('label','text','Value_not_set','label-text',1,0,0))<br />attributes_pg_shseclabel.append(('objoid','oid','Value_not_set','objoid-oid',1,0,0))<br />attributes_pg_shseclabel.append(('classoid','oid','Value_not_set','classoid-oid',1,0,0))<br />attributes_pg_shseclabel.append(('provider','text','Value_not_set','provider-text',1,0,0))<br />attributes_pg_shseclabel.append(('label','text','Value_not_set','label-text',1,0,0))<br />attributes_pg_collation.append(('collname','name','Value_not_set','collname-name',1,0,0))<br />attributes_pg_collation.append(('collnamespace','oid','Value_not_set','collnamespace-oid',1,0,0))<br />attributes_pg_collation.append(('collowner','oid','Value_not_set','collowner-oid',1,0,0))<br />attributes_pg_collation.append(('collencoding','integer','Value_not_set','collencoding-integer',1,0,0))<br />attributes_pg_collation.append(('collcollate','name','Value_not_set','collcollate-name',1,0,0))<br />attributes_pg_collation.append(('collctype','name','Value_not_set','collctype-name',1,0,0))<br />attributes_pg_range.append(('rngtypid','oid','Value_not_set','rngtypid-oid',1,0,0))<br />attributes_pg_range.append(('rngsubtype','oid','Value_not_set','rngsubtype-oid',1,0,0))<br />attributes_pg_range.append(('rngcollation','oid','Value_not_set','rngcollation-oid',1,0,0))<br />attributes_pg_range.append(('rngsubopc','oid','Value_not_set','rngsubopc-oid',1,0,0))<br />attributes_pg_range.append(('rngcanonical','regproc','Value_not_set','rngcanonical-regproc',1,0,0))<br />attributes_pg_range.append(('rngsubdiff','regproc','Value_not_set','rngsubdiff-regproc',1,0,0))<br />attributes_pg_largeobject.append(('loid','oid','Value_not_set','loid-oid',1,0,0))<br />attributes_pg_largeobject.append(('pageno','integer','Value_not_set','pageno-integer',1,0,0))<br />attributes_pg_largeobject.append(('data','bytea','Value_not_set','data-bytea',1,0,0))<br />attributes_pg_attrdef.append(('adrelid','oid','Value_not_set','adrelid-oid',1,0,0))<br />attributes_pg_attrdef.append(('adnum','smallint','Value_not_set','adnum-smallint',1,0,0))<br />attributes_pg_attrdef.append(('adbin','pg_node_tree','Value_not_set','adbin-pg_node_tree',1,0,0))<br />attributes_pg_attrdef.append(('adsrc','text','Value_not_set','adsrc-text',1,0,0))<br />attributes_pg_namespace.append(('nspname','name','Value_not_set','nspname-name',1,0,0))<br />attributes_pg_namespace.append(('nspowner','oid','Value_not_set','nspowner-oid',1,0,0))<br />attributes_pg_namespace.append(('nspacl','ARRAY','Value_not_set','nspacl-ARRAY',1,0,0))<br />attributes_pg_rewrite.append(('rulename','name','Value_not_set','rulename-name',1,0,0))<br />attributes_pg_rewrite.append(('ev_class','oid','Value_not_set','ev_class-oid',1,0,0))<br />attributes_pg_rewrite.append(('ev_attr','smallint','Value_not_set','ev_attr-smallint',1,0,0))<br />attributes_pg_rewrite.append(('ev_type','"char"','Value_not_set','ev_type-"char"',1,0,0))<br />attributes_pg_rewrite.append(('ev_enabled','"char"','Value_not_set','ev_enabled-"char"',1,0,0))<br />attributes_pg_rewrite.append(('is_instead','boolean','Value_not_set','is_instead-boolean',1,0,0))<br />attributes_pg_rewrite.append(('ev_qual','pg_node_tree','Value_not_set','ev_qual-pg_node_tree',1,0,0))<br />attributes_pg_rewrite.append(('ev_action','pg_node_tree','Value_not_set','ev_action-pg_node_tree',1,0,0))<br />pg_conversion.properties["attributes"]=attributes_pg_conversion<br />pg_foreign_data_wrapper.properties["attributes"]=attributes_pg_foreign_data_wrapper<br />pg_collation.properties["attributes"]=attributes_pg_collation<br />pg_range.properties["attributes"]=attributes_pg_range<br />pg_class.properties["attributes"]=attributes_pg_class<br />pg_opclass.properties["attributes"]=attributes_pg_opclass<br />pg_opfamily.properties["attributes"]=attributes_pg_opfamily<br />pg_trigger.properties["attributes"]=attributes_pg_trigger<br />pg_auth_members.properties["attributes"]=attributes_pg_auth_members<br />pg_operator.properties["attributes"]=attributes_pg_operator<br />pg_attribute.properties["attributes"]=attributes_pg_attribute<br />pg_ts_parser.properties["attributes"]=attributes_pg_ts_parser<br />pg_default_acl.properties["attributes"]=attributes_pg_default_acl<br />pg_depend.properties["attributes"]=attributes_pg_depend<br />pg_statistic.properties["attributes"]=attributes_pg_statistic<br />pg_attrdef.properties["attributes"]=attributes_pg_attrdef<br />pg_language.properties["attributes"]=attributes_pg_language<br />pg_tablespace.properties["attributes"]=attributes_pg_tablespace<br />pg_db_role_setting.properties["attributes"]=attributes_pg_db_role_setting<br />pg_seclabel.properties["attributes"]=attributes_pg_seclabel<br />pg_shdepend.properties["attributes"]=attributes_pg_shdepend<br />pg_event_trigger.properties["attributes"]=attributes_pg_event_trigger<br />pg_shseclabel.properties["attributes"]=attributes_pg_shseclabel<br />pg_aggregate.properties["attributes"]=attributes_pg_aggregate<br />pg_index.properties["attributes"]=attributes_pg_index<br />pg_inherits.properties["attributes"]=attributes_pg_inherits<br />pg_rewrite.properties["attributes"]=attributes_pg_rewrite<br />pg_ts_dict.properties["attributes"]=attributes_pg_ts_dict<br />pg_foreign_table.properties["attributes"]=attributes_pg_foreign_table<br />pg_constraint.properties["attributes"]=attributes_pg_constraint<br />pg_enum.properties["attributes"]=attributes_pg_enum<br />pg_amproc.properties["attributes"]=attributes_pg_amproc<br />pg_extension.properties["attributes"]=attributes_pg_extension<br />pg_shdescription.properties["attributes"]=attributes_pg_shdescription<br />pg_pltemplate.properties["attributes"]=attributes_pg_pltemplate<br />pg_ts_config.properties["attributes"]=attributes_pg_ts_config<br />pg_amop.properties["attributes"]=attributes_pg_amop<br />pg_cast.properties["attributes"]=attributes_pg_cast<br />pg_user_mapping.properties["attributes"]=attributes_pg_user_mapping<br />pg_type.properties["attributes"]=attributes_pg_type<br />pg_largeobject.properties["attributes"]=attributes_pg_largeobject<br />pg_am.properties["attributes"]=attributes_pg_am<br />pg_largeobject_metadata.properties["attributes"]=attributes_pg_largeobject_metadata<br />pg_ts_config_map.properties["attributes"]=attributes_pg_ts_config_map<br />pg_ts_template.properties["attributes"]=attributes_pg_ts_template<br />pg_database.properties["attributes"]=attributes_pg_database<br />pg_namespace.properties["attributes"]=attributes_pg_namespace<br />pg_proc.properties["attributes"]=attributes_pg_proc<br />pg_foreign_server.properties["attributes"]=attributes_pg_foreign_server<br />pg_authid.properties["attributes"]=attributes_pg_authid<br />pg_description.properties["attributes"]=attributes_pg_description<br />layer.add_object(pg_conversion)<br />layer.add_object(pg_foreign_data_wrapper)<br />layer.add_object(pg_collation)<br />layer.add_object(pg_range)<br />layer.add_object(pg_class)<br />layer.add_object(pg_opclass)<br />layer.add_object(pg_opfamily)<br />layer.add_object(pg_trigger)<br />layer.add_object(pg_auth_members)<br />layer.add_object(pg_operator)<br />layer.add_object(pg_attribute)<br />layer.add_object(pg_ts_parser)<br />layer.add_object(pg_default_acl)<br />layer.add_object(pg_depend)<br />layer.add_object(pg_statistic)<br />layer.add_object(pg_attrdef)<br />layer.add_object(pg_language)<br />layer.add_object(pg_tablespace)<br />layer.add_object(pg_db_role_setting)<br />layer.add_object(pg_seclabel)<br />layer.add_object(pg_shdepend)<br />layer.add_object(pg_event_trigger)<br />layer.add_object(pg_shseclabel)<br />layer.add_object(pg_aggregate)<br />layer.add_object(pg_index)<br />layer.add_object(pg_inherits)<br />layer.add_object(pg_rewrite)<br />layer.add_object(pg_ts_dict)<br />layer.add_object(pg_foreign_table)<br />layer.add_object(pg_constraint)<br />layer.add_object(pg_enum)<br />layer.add_object(pg_amproc)<br />layer.add_object(pg_extension)<br />layer.add_object(pg_shdescription)<br />layer.add_object(pg_pltemplate)<br />layer.add_object(pg_ts_config)<br />layer.add_object(pg_amop)<br />layer.add_object(pg_cast)<br />layer.add_object(pg_user_mapping)<br />layer.add_object(pg_type)<br />layer.add_object(pg_largeobject)<br />layer.add_object(pg_am)<br />layer.add_object(pg_largeobject_metadata)<br />layer.add_object(pg_ts_config_map)<br />layer.add_object(pg_ts_template)<br />layer.add_object(pg_database)<br />layer.add_object(pg_namespace)<br />layer.add_object(pg_proc)<br />layer.add_object(pg_foreign_server)<br />layer.add_object(pg_authid)<br />layer.add_object(pg_description)<br />oType=dia.get_object_type("UML - Activity")<br />oend,h1,h2=oType.create(0,-3)<br />theObjects.append(oend)<br />oend.properties["text"]="PG_CATALOG: Claudio Bezerra Leopoldino - Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com.br/ - claudiob_br@yahoo.com.br"<br />layer.add_object(oend)<br />diagram.save()<br />print"GenerationFINISHED"<br /></b></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><b><br /></b></span></div>
<b>3 - Execução do script no DIA</b><br />
<br />
É feita através do python console, acessado pelo menu "Diálogos/Python Console" do DIA.<br />
<br />
Para executar, basta digitar no console "execfile("nomedoarquivo")" e confirmar com enter, como na figura abaixo. Após a execução, o DIA criará o diagrama de acord com o script python fornecido.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEithhQ3IUpxe7P_4UunVvh9EIiOkBQgA3TGiTOpoCK6rtgQAbD_9scuRDPhNSnn4FamaMet71Uj7YFwmWn7J8KPoyIXR__6-QW8Ij6qKq1qM7a-rv3Wrc5gUEMG38fGm994ITdz3vwCIdh-/s1600/Captura_de_tela-Python+Dia+Console.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="95" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEithhQ3IUpxe7P_4UunVvh9EIiOkBQgA3TGiTOpoCK6rtgQAbD_9scuRDPhNSnn4FamaMet71Uj7YFwmWn7J8KPoyIXR__6-QW8Ij6qKq1qM7a-rv3Wrc5gUEMG38fGm994ITdz3vwCIdh-/s320/Captura_de_tela-Python+Dia+Console.png" width="320" /></a></div>
<div style="text-align: center;">
<b>Figura 3 - Python Console</b></div>
<br />
<b>4 - Geração de Script Python - INFORMATION_SCHEMA</b> <br />
<br />
Abaixo coloco a consulta de geração do diagrama do esquema information_schema:<br />
<br />
<span style="font-size: x-small;"><b style="font-family: "Courier New",Courier,monospace;">SELECT CAST ('diagram = dia.new("INFORMATION_SCHEMA.dia")' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('data = diagram.data' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('display = diagram.display()' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('layer = data.active_layer' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('pg_objtype = "UML - Class"' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('oType = dia.get_object_type (pg_objtype)' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST ('theObjects = [diagram, data, layer, display, oType]' AS TEXT) as OBJETO<br />UNION ALL<br />SELECT CAST(relname || ', h1, h2 = oType.create (' || 20*(row_number() OVER (PARTITION BY schemaname)) || ',1)' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL<br />SELECT CAST('theObjects.append(' || relname || ')' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL <br />SELECT CAST(relname || '.properties["stereotype"] = "information_schema"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL <br />SELECT CAST(relname || '.properties["comment"] = "' || relname || ' Class"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL <br />SELECT CAST(relname || '.properties["name"] = "' || relname || '"' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL <br />SELECT CAST('attributes_' || relname || ' = []' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL <br />SELECT CAST('attributes_' || table_name || '.append((''' || column_name || ''',''' || data_type ||''',''Value_not_set'',''' || column_name || '-' || data_type || ''',1,0,0)) ' AS TEXT) as OBJETO from information_schema.columns where table_schema = 'information_schema' AND table_name IN (SELECT relname as table_name FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema')<br />UNION ALL<br />SELECT CAST(relname || '.properties["attributes"] = attributes_' || relname as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL<br />SELECT CAST('layer.add_object (' || relname || ')' as TEXT) as OBJETO FROM pg_catalog.pg_statio_sys_tables WHERE schemaname = 'information_schema'<br />UNION ALL<br />SELECT CAST('oType = dia.get_object_type ("UML - Activity")' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('oend, h1, h2 = oType.create (0,-1)' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('theObjects.append(oend)' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('oend.properties["text"] = "INFORMATION_SCHEMA: Claudio Bezerra Leopoldino - Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com.br/ - claudiob_br@yahoo.com.br"' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('layer.add_object (oend)' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('diagram.save()' as TEXT) as OBJETO <br />UNION ALL<br />SELECT CAST('print "Generation FINISHED"' as TEXT) as OBJETO;</b></span><br /><br />
<b>5 - Script Python Produzido - INFORMATION_SCHEMA </b><br />
<br />
Abaixo coloco a listagem do script python produzido e editado: <br />
<br />
<span style="font-size: x-small;"><b><span style="font-family: "Courier New",Courier,monospace;">diagram=dia.new("INFORMATION_SCHEMA.dia")</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">data=diagram.data</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">display=diagram.display()</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer=data.active_layer</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">pg_objtype="UML - Class"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">oType=dia.get_object_type(pg_objtype)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects=[diagram,data,layer,display,oType]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_implementation_info,h1,h2=oType.create(20,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing_profiles,h1,h2=oType.create(40,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_features,h1,h2=oType.create(60,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_languages,h1,h2=oType.create(80,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_packages,h1,h2=oType.create(100,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_parts,h1,h2=oType.create(120,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing,h1,h2=oType.create(140,1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_implementation_info)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_sizing_profiles)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_features)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_languages)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_packages)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_parts)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(sql_sizing)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_implementation_info.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing_profiles.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_features.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_languages.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_packages.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_parts.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing.properties["stereotype"]="information_schema"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_implementation_info.properties["comment"]="sql_implementation_infoClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing_profiles.properties["comment"]="sql_sizing_profilesClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_features.properties["comment"]="sql_featuresClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_languages.properties["comment"]="sql_languagesClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_packages.properties["comment"]="sql_packagesClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_parts.properties["comment"]="sql_partsClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing.properties["comment"]="sql_sizingClass"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_implementation_info.properties["name"]="sql_implementation_info"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing_profiles.properties["name"]="sql_sizing_profiles"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_features.properties["name"]="sql_features"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_languages.properties["name"]="sql_languages"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_packages.properties["name"]="sql_packages"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_parts.properties["name"]="sql_parts"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing.properties["name"]="sql_sizing"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing=[]</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info.append(('implementation_info_id','charactervarying','Value_not_set','implementation_info_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info.append(('implementation_info_name','charactervarying','Value_not_set','implementation_info_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info.append(('integer_value','integer','Value_not_set','integer_value-integer',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info.append(('character_value','charactervarying','Value_not_set','character_value-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_implementation_info.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_source','charactervarying','Value_not_set','sql_language_source-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_year','charactervarying','Value_not_set','sql_language_year-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_conformance','charactervarying','Value_not_set','sql_language_conformance-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_integrity','charactervarying','Value_not_set','sql_language_integrity-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_implementation','charactervarying','Value_not_set','sql_language_implementation-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_binding_style','charactervarying','Value_not_set','sql_language_binding_style-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_languages.append(('sql_language_programming_language','charactervarying','Value_not_set','sql_language_programming_language-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages.append(('feature_id','charactervarying','Value_not_set','feature_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages.append(('feature_name','charactervarying','Value_not_set','feature_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages.append(('is_supported','charactervarying','Value_not_set','is_supported-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages.append(('is_verified_by','charactervarying','Value_not_set','is_verified_by-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_packages.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts.append(('feature_id','charactervarying','Value_not_set','feature_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts.append(('feature_name','charactervarying','Value_not_set','feature_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts.append(('is_supported','charactervarying','Value_not_set','is_supported-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts.append(('is_verified_by','charactervarying','Value_not_set','is_verified_by-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_parts.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles.append(('sizing_id','integer','Value_not_set','sizing_id-integer',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles.append(('sizing_name','charactervarying','Value_not_set','sizing_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles.append(('profile_id','charactervarying','Value_not_set','profile_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles.append(('required_value','integer','Value_not_set','required_value-integer',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing_profiles.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('feature_id','charactervarying','Value_not_set','feature_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('feature_name','charactervarying','Value_not_set','feature_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('sub_feature_id','charactervarying','Value_not_set','sub_feature_id-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('sub_feature_name','charactervarying','Value_not_set','sub_feature_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('is_supported','charactervarying','Value_not_set','is_supported-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('is_verified_by','charactervarying','Value_not_set','is_verified_by-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_features.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing.append(('sizing_id','integer','Value_not_set','sizing_id-integer',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing.append(('sizing_name','charactervarying','Value_not_set','sizing_name-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing.append(('supported_value','integer','Value_not_set','supported_value-integer',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">attributes_sql_sizing.append(('comments','charactervarying','Value_not_set','comments-charactervarying',1,0,0))</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_implementation_info.properties["attributes"]=attributes_sql_implementation_info</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing_profiles.properties["attributes"]=attributes_sql_sizing_profiles</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_features.properties["attributes"]=attributes_sql_features</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_languages.properties["attributes"]=attributes_sql_languages</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_packages.properties["attributes"]=attributes_sql_packages</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_parts.properties["attributes"]=attributes_sql_parts</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">sql_sizing.properties["attributes"]=attributes_sql_sizing</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_implementation_info)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_sizing_profiles)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_features)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_languages)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_packages)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_parts)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(sql_sizing)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">oType=dia.get_object_type("UML - Activity")</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">oend,h1,h2=oType.create(0,-1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">theObjects.append(oend)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">oend.properties["text"]="INFORMATION_SCHEMA: Claudio Bezerra Leopoldino - Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com.br/ - claudiob_br@yahoo.com.br"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">layer.add_object(oend)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">diagram.save()</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">print"GenerationFINISHED"</span></b></span><br />
<br />
<b>6 - Limitações e Considerações Finais</b><br />
<br />
O Dia é mais uma ferramenta de modelagem de diagramas visuais que uma ferramenta de banco de dados, e esta não é uma limitação pequena, apesar da grande flexibilidade em se gerar bons resultados através de scripts. Não espere a geração de SQL, ou outras rotinas avançadas em uma ferramenta de diagramas!<br />
<br />
O nosso script não faz o layout automático levando em conta os relacionamentos. Nos casos mostrados, não existem relacionamentos na forma foreign keis entre as tabelas de sistema, mas isso pode ser necessário para a sua necessidade. Implemente!<br />
<br />
Você está convidado a indicar melhorias nos códigos aqui apresentados, criar seus diagramas, testar novos diagramas, e scripts, e a compartilhá-los!<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-11796145849227553882013-09-18T16:51:00.002-03:002013-09-18T16:51:20.669-03:00Nada a temer com Lateral Joins no PostgreSQL 9.3!A Junção Lateral, ou <b>lateral join</b>, permite subselects mais legíveis e de fácil entendimento, dentro da cláusula FROM dos comandos SELECT. Através deste recurso, um item da cláusula FROM pode referenciar outro que esteja à sua esquerda, isto é, colunas de tabelas já listadas na cláusula FROM podem ser diretamente referenciadas. Lateral joins são compatíveis com CROSS, INNER ou LEFT joins. <br />
<br />
<br />
<br />
<br />
Adicionalmente, é possível fazer <b>lateral joins utilizando o resultado de funções</b> executadas na cláusula FROM como tabelas.<br />
<br />Antes de mostrar o funcionamento desta nova funcionalidade da versão 9.3 do postgres, vamos criar algumas tabelas básicas para utilização nos exemplos.<br /><br /><span style="font-family: "Courier New",Courier,monospace;">CREATE TABLE r1 (c1 integer, c2 integer);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r1 VALUES (1,1);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r1 VALUES (2,2);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r1 VALUES (null,null);</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">CREATE TABLE r2 (c1 integer, c2 integer);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r2 VALUES (1,1);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r2 VALUES (2,2);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r2 VALUES (null,null);</span><br style="font-family: "Courier New",Courier,monospace;" /><br /><b>* Sintaxe com CROSS JOIN </b><br /><br />
Com o uso de LATERAL, ao invés de colocar referência ao campo da tabela r1 na cláusula WHERE, a mesma é feita dentro da cláusula FROM consulta, facilitando a legibilidade e apresentando o mesmo resultado final.<br />
<br />
Isso ocorre tanto no produto cartesiano, ou cross join, quanto nas outras modalidades de lateral join.<br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * <b>FROM</b> r1 <b>CROSS JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and <b>r1.c1 IS NOT NULL</b>) AS RLATERAL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(4 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br /><br /><b>* Sintaxe com INNER JOIN</b><br /><br /><span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1 <b>INNER JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(2 registros)</span><br /><br /><b>* Exemplo de sintaxe com LEFT JOIN</b><br /><br /><span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1 <b>LEFT JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | | </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(3 registros)</span><br /><br /><b>* Sintaxe com JOIN tradicional.</b><br />
<br />
<br />
<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1 <b>JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and <b>r1.c1 IS NOT NULL</b>) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(2 registros)</span><br />
<br />
<br />
<br />
<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1, <b>LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and <b>r1.c1 IS NOT NULL</b>) AS RLATERAL </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# WHERE r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(2 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><b>* Não funciona com FULL JOIN</b><br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1 </span><b style="font-family: "Courier New",Courier,monospace;">FULL JOIN LATERAL</b><span style="font-family: "Courier New",Courier,monospace;"> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><b style="color: #660000; font-family: "Courier New",Courier,monospace;">ERRO:</b><span style="font-family: "Courier New",Courier,monospace;"> referência inválida para tabela "r1" na cláusula FROM</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">LINHA 1: ...N LATERAL (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS N...</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ^</span><br style="font-family: "Courier New",Courier,monospace;" /><b style="color: #660000; font-family: "Courier New",Courier,monospace;">DETALHE</b><span style="font-family: "Courier New",Courier,monospace;">: The combining JOIN type must be INNER or LEFT for a LATERAL reference.</span><br /><br /><b>* Também não funciona com RIGHT JOIN</b><br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1 <b>RIGHT JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"><b style="color: #660000;">ERRO:</b> referência inválida para tabela "r1" na cláusula FROM</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">LINHA 1: ...N LATERAL (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS N...</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ^</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"><b style="color: #660000;">DETALHE:</b> The combining JOIN type must be INNER or LEFT for a LATERAL reference.</span><br style="font-family: "Courier New",Courier,monospace;" /><br /><b>* Lateral Join envolvendo três tabelas</b><br /><br />
Para fazer este teste, é necessário criar a tabela r3. Observe que a segunda junção lateral referencia os dados com base no alias RLATERAL, utilizado na primeira junção.<br /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">CREATE TABLE r3 (c1 integer, c2 integer);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r3 VALUES (1,1);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r3 VALUES (2,2);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT INTO r3 VALUES (null,null);</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT *</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# FROM r1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# <b>JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and <b>r1.c1 IS NOT NULL</b>) AS <b>RLATERAL</b> ON r1.c1 = RLATERAL.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# <b>JOIN LATERAL</b> (SELECT * FROM r3 WHERE r3.c1 <> 10 and <b><span style="color: #660000;">RLATERAL.c1</span> IS NOT NULL</b>) AS RLATERAL2 ON RLATERAL.c1 = RLATERAL2.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | c1 | c2 | c1 | c2 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+----+----+----+----</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1 | 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2 | 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(2 registros)</span><br /><br /><b>* Lateral Joins com Funções </b><br />
<br />
Podem ser utilizadas subconsultas com o retorno de funções e lateral join. O exemplo abaixo ilustra esta funcionalidade.<br />
<br />
Exemplo 1: produto cartesiano com a cláusula lateral.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1, <b>LATERAL</b> (SELECT <b style="color: #660000;">generate_series</b>(1,3) AS SERIE) AS RLATERAL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | serie </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+-------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1 | 1 | 3</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 2 | 2 | 3</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 3</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(9 registros)</span><br />
<br />
Exemplo 2: referenciando tabela da função.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT * FROM r1, </span><b style="font-family: "Courier New",Courier,monospace;">LATERAL</b><span style="font-family: "Courier New",Courier,monospace;"> (SELECT </span><b style="color: #660000; font-family: "Courier New",Courier,monospace;">generate_series</b><span style="font-family: "Courier New",Courier,monospace;">(1,3) AS SERIE WHERE </span><b style="color: #660000; font-family: "Courier New",Courier,monospace;">r1.c1 IS NULL</b><span style="font-family: "Courier New",Courier,monospace;">) AS RLATERAL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> c1 | c2 | serie </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+----+-------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 2</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> | | 3</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(3 registros)</span><br />
<b> </b><br />
<b>* Lateral Joins e Desempenho</b><br /><br />
Não foi detectada qualquer diferença em termos de desempenho entre o lateral join e o uso de subqueries. O seu uso deve ser feito em virtude da maior clareza que dá à consulta. Os exemplos abaixo corroboram esta afirmativa:<br /><br /><b>Exemplo 1: Cross Join</b><br /><br /><span style="font-family: "Courier New",Courier,monospace;">postgres=# EXPLAIN SELECT * FROM r1 <b>CROSS JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> QUERY PLAN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">------------------------------------------------------------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Nested Loop (<b><span style="color: #660000;">cost=0.00..56731.49</span></b> rows=4532641 width=16)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r1 (cost=0.00..31.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 IS NOT NULL)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Materialize (cost=0.00..47.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r2 (cost=0.00..36.75 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 <> 10)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(6 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# EXPLAIN SELECT * FROM r1 <b>CROSS JOIN</b> (SELECT * FROM r2 WHERE r2.c1 <> 10) AS RLATERAL</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# WHERE r1.c1 IS NOT NULL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> QUERY PLAN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">------------------------------------------------------------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Nested Loop (<b style="color: #660000;">cost=0.00..56731.49</b> rows=4532641 width=16)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r1 (cost=0.00..31.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 IS NOT NULL)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Materialize (cost=0.00..47.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r2 (cost=0.00..36.75 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 <> 10)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(6 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br /><br /><b>Exemplo 2: Join Tradicional</b><br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# EXPLAIN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# SELECT * FROM r1 <b>JOIN LATERAL</b> (SELECT * FROM r2 WHERE r2.c1 <> 10 and r1.c1 IS NOT NULL) AS RLATERAL ON r1.c1 = RLATERAL.c1;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> QUERY PLAN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">------------------------------------------------------------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Merge Join (<b style="color: #660000;">cost=303.53..654.12 rows=22663 width=16</b>)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Merge Cond: (r1.c1 = r2.c1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Sort (cost=149.09..154.41 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Sort Key: r1.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r1 (cost=0.00..31.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 IS NOT NULL)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Sort (cost=154.44..159.76 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Sort Key: r2.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r2 (cost=0.00..36.75 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 <> 10)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(10 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# EXPLAIN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# SELECT * FROM r1 <b>JOIN</b> (SELECT * FROM r2 WHERE r2.c1 <> 10) AS RLATERAL ON r1.c1 = RLATERAL.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres-# WHERE r1.c1 IS NOT NULL;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> QUERY PLAN </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">------------------------------------------------------------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Merge Join (<b style="color: #660000;">cost=303.53..654.12 rows=22663 width=16</b>)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Merge Cond: (r1.c1 = r2.c1)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Sort (cost=149.09..154.41 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Sort Key: r1.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r1 (cost=0.00..31.40 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 IS NOT NULL)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Sort (cost=154.44..159.76 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Sort Key: r2.c1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> -> Seq Scan on r2 (cost=0.00..36.75 rows=2129 width=8)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Filter: (c1 <> 10)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(10 registros)</span><br style="font-family: "Courier New",Courier,monospace;" /><br /><b>* Considerações finais</b><br /><br />Lateral joins são úteis para gerar códigos mais legíveis, evitando a separação entre as condições de junção da cláusula WHERE e a tabela referenciada na cláusula FROM dos SELECTS. Este recurso parece ser particularmente útil para comandos muito grandes, que se tornam difíceis de manter. No entanto, se os desenvolvedores forem familiarizados com a sintaxe padrão, a mesma pode ser mantida sem problemas, evitando problemas no entendimento do SQL na manutenção das consultas.<br /><br />
Para quem deseja maior desempenho, o comando não trouxe benefícios.<br /><br />
Evite o uso de lateral joins caso necessite de portabilidade com outros SGBDs, optando pelas sintaxes mais tradicionais para a realização de consultas.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-37135211437090143952013-09-09T10:48:00.002-03:002013-09-09T10:48:21.529-03:00PostgreSQL 9.3 Lançado!A aguardada versão 9.3 do PostgreSQL foi oficialmente lançada hoje. Divulgue, baixe, teste e use!<br />
<br />
As principais alterações aumentam a performance, flexibilidade e a confiabilidade do banco.<br />
<br />
Cito como destaques:<br />
- Foreign data wrappers que permitem a gravação em dados externos;<br />
- Visões atualizáveis automaticamente;<br />
- Possibilidade de rodar pg_dump com paralelismo, aumentando a performance desta operação;<br />
- Vários outros recursos que você pode conferir <a href="http://www.postgresql.org/about/news/1481/" target="_blank">aqui</a>. <div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-47552672577003532662013-09-04T13:59:00.000-03:002013-09-04T13:59:14.144-03:00Você REALMENTE Sabe Lidar com Valores Nulos no PostgreSQL?O título desta postagem é uma pergunta que me fiz. Eu achava que sim, mas ao fazer uns testes e pesquisas, vi que o assunto é mais amplo do que eu pensava inicialmente. Convido o leitor a explorar todas as principais variações do tratamento de valores nulos no postgresql.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjipBpoO5TmpB_qQ_64lUVnRR4V4ufAlx9WyukPxKVp7JrZ43sGJdSKpqhIBiRMBbk_4lzIo2JC-j97x7tCLlIkb1_BWKziALw0BN30Dmq2_KFbctpROKAWGDz17fJMRt9nyB-ngnYBgdjj/s1600/NullFreeFont03.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjipBpoO5TmpB_qQ_64lUVnRR4V4ufAlx9WyukPxKVp7JrZ43sGJdSKpqhIBiRMBbk_4lzIo2JC-j97x7tCLlIkb1_BWKziALw0BN30Dmq2_KFbctpROKAWGDz17fJMRt9nyB-ngnYBgdjj/s320/NullFreeFont03.gif" width="286" /></a></div>
<br />
<b>* Primeiro ponto: Nulo não é zero, nem '', nem espaço. </b><br />
<br />
Nulo significa nulo, que o valor não foi preenchido. Vejamos o exemplo abaixo:<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# SELECT (null = '') IS TRUE AS COMPARA1, (null = ' ') IS TRUE AS COMPARA2, (null = 0) IS TRUE AS COMPARA3;<br /> compara1 | compara2 | compara3 <br />----------+----------+----------<br /> f | f | f<br />(1 registro)</b><br />
<br />
<b>* Saiba testar se um valor é nulo ou não (IN NULL e IS NOT NULL)</b><br />
<br />
O exemplo abaixo utiliza IS NULL e IS NOT NULL: <br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<b>teste=# SELECT (1 <span style="color: #660000;">IS NULL</span>) AS COMPARA1, (1 <span style="color: #660000;">IS NOT NULL</span>) AS COMPARA2; <br /> compara1 | compara2 <br />----------+----------<br /> f | t<br />(1 registro)</b></div>
<div style="font-family: "Courier New",Courier,monospace;">
</div>
<br />
<br />
<b>* Saiba que valores nulos retornam nulo em comparações (IN, NOT IN, =, !=, etc.)</b><br />
<br />
Esta é uma decorrência do padrão SQL.<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# SELECT null NOT IN (1,2,3), null IN (1,2,3);<br /> ?column? | ?column? <br />----------+----------<br /> | <br />(1 registro)<br /><br />teste=# SELECT 1 NOT IN (null), 1 IN (null);<br /> ?column? | ?column? <br />----------+----------<br /> | <br />(1 registro)<br /><br />teste=# SELECT 1 != null, 1 = null;<br /> ?column? | ?column? <br />----------+----------<br /> | <br />(1 registro)</b><br />
<br />
<b>* Criar tabelas que aceitem e rejeitem campos nulos é importante!</b><br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">teste=# CREATE TABLE TSTNULL (campo1 INTEGER <span style="color: #660000;">NOT NULL</span>, campo2 INTEGER <span style="color: #660000;">NULL</span>, campo3 INTEGER);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">CREATE TABLE</span></b><br />
<br />
<b>* Como manipular valores nulos e não nulos nas tabelas criadas?</b><br />
<br />
Use o valor null para deixar o campo desejado sem valor algum. Caso se utilize DEFAULT, o campo assume valor nulo se não há um valor default definido.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<b>teste=# INSERT INTO TSTNULL VALUES (1, null, DEFAULT); --O DEFAULT é NULO, CASO NÃO FORNECIDO<br />INSERT 0 1<br />teste=# INSERT INTO TSTNULL VALUES (null, 1, 1); <br /><span style="color: #660000;">ERRO: valor nulo na coluna "campo1" viola a restrição não-nula</span><br /> </b></div>
<b style="font-family: "Courier New",Courier,monospace;">teste=# <br />teste=# SELECT * FROM TSTNULL;<br /> campo1 | campo2 | campo3 <br />--------+--------+--------<br /> 1 | | <br />(1 registro)</b><br />
<br />
<b>* Entenda que campos UNIQUE aceitam vários valores nulos. </b><br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace;">teste=# CREATE TABLE TSTNULL2 (campo1 INTEGER UNIQUE);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">NOTA: CREATE TABLE / UNIQUE criará índice implícito "tstnull2_campo1_key" na tabela "tstnull2"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">CREATE TABLE</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# INSERT INTO TSTNULL2 VALUES (1);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT 0 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# INSERT INTO TSTNULL2 VALUES (<span style="color: #660000;">NULL</span>);</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT 0 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# INSERT INTO TSTNULL2 VALUES (<span style="color: #660000;">NULL</span>); --NAO GERA ERRO</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">INSERT 0 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">teste=# SELECT * FROM TSTNULL2;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> campo1 </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">--------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 1</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="color: #660000; font-family: "Courier New",Courier,monospace;">(3 registros)</span></b><br />
<br />
<b>* Campos PRIMARY KEY não aceitam nulos por definição. Você sabia?</b><br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# --CAMPOS PRIMARY KEY NÃO ACEITAM NULOS<br />teste=# CREATE TABLE TSTNULL3 (campo1 INTEGER PRIMARY KEY);<br />NOTA: CREATE TABLE / PRIMARY KEY criará índice implícito "tstnull3_pkey" na tabela "tstnull3"<br />CREATE TABLE<br />teste=# <br />teste=# INSERT INTO TSTNULL3 VALUES (1);<br />INSERT 0 1<br />teste=# INSERT INTO TSTNULL3 VALUES (<span style="color: #660000;">NULL</span>); --ERRO<br /><span style="color: #660000;">ERRO: valor nulo na coluna "campo1" viola a restrição não-nula</span><br style="color: #660000;" /><span style="color: #660000;">teste=# </span></b> <br />
<br />
<b>* Campos PRIMARY KEY com mais de um campo também não aceitam nulos.</b><br />
<br />
<b><span style="color: black; font-family: "Courier New",Courier,monospace;">teste=# CREATE TABLE TSTNULL4 (campo1 INTEGER, campo2 INTEGER,</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">teste(# CONSTRAINT PK_TESTNULL4 PRIMARY KEY (campo1, campo2));</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">NOTA: CREATE TABLE / PRIMARY KEY criará índice implícito "pk_testnull4" na tabela "tstnull4"</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">CREATE TABLE</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">teste=# </span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">teste=# INSERT INTO TSTNULL4 VALUES (1, 1);</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">INSERT 0 1</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: black; font-family: "Courier New",Courier,monospace;">teste=# INSERT INTO TSTNULL4 VALUES (1, <span style="color: #660000;">NULL</span>); --ERRO</span><br style="color: black; font-family: "Courier New",Courier,monospace;" /><span style="color: #660000; font-family: "Courier New",Courier,monospace;">ERRO: valor nulo na coluna "campo2" viola a restrição não-nula</span><br style="color: #660000; font-family: "Courier New",Courier,monospace;" /><span style="color: #660000; font-family: "Courier New",Courier,monospace;">teste=# </span></b><br />
<br />
<b>* Consultas podem ordenar os valores nulos, colocando-os na frente ou atrás do resultado da consulta.</b><br />
<br />
Para obter este efeito, empregue as cláusulas NULLS FIRST e NULLS LAST. O padrão é colocar os valores nulos por último no retorno da consulta.<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# SELECT * FROM TSTNULL ORDER BY CAMPO2 <span style="color: #660000;">NULLS FIRST</span>;<br /> campo1 | campo2 | campo3 <br />--------+--------+--------<br /> 1 | | <br />(1 registro)<br /><br />teste=# SELECT * FROM TSTNULL ORDER BY CAMPO2 <span style="color: #660000;">NULLS LAST</span>;<br /> campo1 | campo2 | campo3 <br />--------+--------+--------<br /> 1 | | <br />(1 registro)<br /><br />teste=# SELECT * FROM TSTNULL ORDER BY CAMPO1 <span style="color: #660000;">NULLS FIRST</span>, CAMPO2 <span style="color: #660000;">NULLS LAST</span>;<br /> campo1 | campo2 | campo3 <br />--------+--------+--------<br /> 1 | | <br />(1 registro)</b><br />
<br />
<b>* A indexação leva em conta campos nulos. Você sabia? </b><br />
<br />
Para influenciar este mecanismo, utilize as cláusulas NULLS FIRST e NULLS LAST.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<b>teste=# CREATE INDEX idx_campo1_first ON TSTNULL (campo1 <span style="color: #660000;">NULLS FIRST</span>);<br />CREATE INDEX</b></div>
<div style="font-family: "Courier New",Courier,monospace;">
<b><br />teste=# CREATE INDEX idx_campo1_last ON TSTNULL (campo1 <span style="color: #660000;">NULLS LAST</span>);<br />CREATE INDEX</b></div>
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="font-family: "Courier New",Courier,monospace;">
<b>teste=# CREATE INDEX idx_campo1_2 ON TSTNULL (campo1 <span style="color: #660000;">NULLS LAST</span>, campo2 <span style="color: #660000;">NULLS FIRST</span>);<br />CREATE INDEX</b></div>
<div style="font-family: Georgia,"Times New Roman",serif;">
<br />
<span style="font-size: small;"><b>* Troque os nulos por um valor padrão usando o comando COPY.</b></span></div>
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">Tanto no COPY FROM quanto no COPY TO, você pode substituir os nulos por um valor mais palatável, utilizando a cláusula NULL.</span><span style="font-family: Georgia,"Times New Roman",serif;"> Não deixe de indicar o valor que substituirá os nulos.</span><b style="font-family: Georgia,"Times New Roman",serif;"><br /></b><br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# COPY TSTNULL TO 'tstnulos.txt' <span style="color: #660000;">NULL 'NULO' </span>CSV;<br />teste=# COPY TSTNULL FROM 'tstnulos.txt' <span style="color: #660000;">NULL 'NULO'</span> CSV;</b><br />
<br />
<b>* É possível "Forçar" valores importados para valores not null, no comando COPY FROM de arquivos CSV. </b><br />
<br />
Basta utilizar a cláusula cláusula FORCE_NOT_NULL, a partir da versão 9.0 do postgresql.Esta cláusula transforma valores nulos em strings de tamanho zero.<br />
<br />
<b style="font-family: "Courier New",Courier,monospace;">teste=# COPY TSTNULL FROM 'tstnulos.txt' (format csv, <span style="color: #660000;">FORCE_NOT_NULL</span>(campo1)); -- VALORES NULOS DE CAMPO1 SÃO LIDOS COMO STRINGS DE TAMANHO ZERO, NÃO COMO NULOS</b><br />
<br />
<b>* Você pode tratar parâmetros nulos nas funções com as cláusulas "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT" ou "STRICT".</b><br />
<br />
Quando desejar aceitar tratar parâmetros com valor nulo em uma função, utilize a cláusula "CALLED ON NULL INPUT". O postgresql não vai retornar erro ou fazer qualquer tratamento sobre o parâmetro, passando esta responsabilidade ao programador da função.<br />
<br />
O uso de "RETURNS NULL ON NULL INPUT" ou "STRICT" faz com que o retorno de uma função com algum parâmetro nulo, seja <b>sempre null</b>.<br />
<br />
O teste é bem simples. Abaixo, coloco alguns exemplos: <br />
<div style="font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="font-family: "Courier New",Courier,monospace;">
<b>CREATE OR REPLACE FUNCTION soma_nulo_1(i integer, j integer) RETURNS integer AS $$<br /> BEGIN<br /> IF <span style="color: #660000;">i IS NULL OR j IS NULL</span> THEN<br /> RETURN 0;<br /> ELSE<br /> RETURN (i + j);<br /> END IF;<br /> END;<br />$$ LANGUAGE plpgsql <span style="color: #660000;">CALLED ON NULL INPUT</span>;<br />SELECT soma_nulo_1(1,2);<br />SELECT soma_nulo_1(null,2);<br /><br />CREATE OR REPLACE FUNCTION soma_nulo_2(i integer, j integer) RETURNS integer AS $$<br /> BEGIN<br /> IF <span style="color: #660000;">i IS NULL OR j IS NULL</span> THEN<br /> RETURN 0;<br /> ELSE<br /> RETURN (i + j);<br /> END IF;<br /> END;<br />$$ LANGUAGE plpgsql <span style="color: #660000;">RETURNS NULL ON NULL INPUT</span>;<br />SELECT soma_nulo_2(1,2);<br />SELECT soma_nulo_2(null,2);<br /><br />CREATE OR REPLACE FUNCTION soma_nulo_3(i integer, j integer) RETURNS integer AS $$<br /> BEGIN<br /> IF <span style="color: #660000;">i IS NULL OR j IS NULL</span> THEN<br /> RETURN 0;<br /> ELSE<br /> RETURN (i + j);<br /> END IF;<br /> END;<br />$$ LANGUAGE plpgsql <span style="color: #660000;">STRICT</span>;<br />SELECT soma_nulo_3(1,2);<br />SELECT soma_nulo_3(null,2);</b></div>
<br />
<b>* Considerações Finais</b><br />
<br />
Tratar valores nulos é de vital importância para evitar inconsistências. O postgresql oferece várias opções para lidar com este tipo de ocorrência.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSyeDf2v2p-wT_4Njzi_T6ARQuEMV91Krq8uOnBLrpsHp9NaSwnFQTEBXulKJ-2rY-3o5e-VdjbEwhTtPkTVokYGnF1HKp15xbhCRteu_BYiuSlAjJI-k9wl03ZmNzR2hDV-T_Wyjg1oXY/s1600/null-value.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSyeDf2v2p-wT_4Njzi_T6ARQuEMV91Krq8uOnBLrpsHp9NaSwnFQTEBXulKJ-2rY-3o5e-VdjbEwhTtPkTVokYGnF1HKp15xbhCRteu_BYiuSlAjJI-k9wl03ZmNzR2hDV-T_Wyjg1oXY/s1600/null-value.gif" /></a></div>
<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com4tag:blogger.com,1999:blog-3371915898459901668.post-80546796359133370072013-07-22T08:28:00.001-03:002013-07-22T08:28:27.287-03:00PostgreSQL 50 SaboresMinha palestra Principal no PgDay Ceará 2013 se chamou "PostgreSQL 50 Sabores". Este nome inusitado deriva das 50 tecnologias associadas ao PostgreSQL que são citadas na apresentação de 50 minutos. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMEct5WT6aHyKx_SKyX5ybHMpwIZm54SDvO64NWUjtcD7i7SWcQGlKUZv0l_mqAOwQSdY5c9X5emrurVW25lTTKo5ZJsv0zO0Z9E88lMesv3CD_MjLEkbzCVRtuw-PvjJqGvizuWGQKEyb/s1600/pigy-head.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMEct5WT6aHyKx_SKyX5ybHMpwIZm54SDvO64NWUjtcD7i7SWcQGlKUZv0l_mqAOwQSdY5c9X5emrurVW25lTTKo5ZJsv0zO0Z9E88lMesv3CD_MjLEkbzCVRtuw-PvjJqGvizuWGQKEyb/s1600/pigy-head.gif" /></a></div>
<br />
Você pode conferir os slides <a href="http://www.slideshare.net/claudiob_br" target="_blank">aqui</a>.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-54996794343537946712013-07-03T13:34:00.000-03:002013-07-03T13:34:06.678-03:00Chamada de Trabalhos para o PgDay Campinas 2013!<div id="yui_3_7_2_1_1372850539044_9019">
O PgDay Campinas 2013 é um evento promissor a ser realizado dia 18 de setembro deste ano.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVz9n5vMqi_XXFDxQc0Nk-wzt63Wl1dGDV86GPdW7HYKTttAt9rzNoPDqRWiFTyNO0Az07ewYp6WNlqommyeK2YlSZ4JB5raDk-o-LG3lBUxEv1mrPClAlOmsBdpCL2fpcAj_aD35j2JbM/s486/Captura_de_tela.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVz9n5vMqi_XXFDxQc0Nk-wzt63Wl1dGDV86GPdW7HYKTttAt9rzNoPDqRWiFTyNO0Az07ewYp6WNlqommyeK2YlSZ4JB5raDk-o-LG3lBUxEv1mrPClAlOmsBdpCL2fpcAj_aD35j2JbM/s320/Captura_de_tela.png" width="320" /></a></div>
</div>
<div id="yui_3_7_2_1_1372850539044_9019">
</div>
<div id="yui_3_7_2_1_1372850539044_9019">
A submissão de palestras e lightning talks (apresentações com no máximo 5 minutos) pode ser feita pelo site do evento:</div>
<div id="yui_3_7_2_1_1372850539044_9064">
<br /></div>
<a href="http://www.pgdaycampinas.com.br/" id="yui_3_7_2_1_1372850539044_9065" rel="nofollow" target="_blank">www.pgdaycampinas.com.br</a><br />
<div id="yui_3_7_2_1_1372850539044_9070">
<br /></div>
<div id="yui_3_7_2_1_1372850539044_9071">
As inscrições iniciam-se em breve. Entre em contato:</div>
<div id="yui_3_7_2_1_1372850539044_9043">
<span class="yiv3256073531" dir="ltr" style="color: #666666; font-size: 12px; line-height: 16px; outline: rgb(0,0,0); text-decoration: none;"><a href="http://www.blogger.com/blogger.g?blogID=3371915898459901668" rel="nofollow" target="_blank">@<span style="outline: rgb(0,0,0);">PGDayCampinas</span> </a></span></div>
<div id="yui_3_7_2_1_1372850539044_9087">
<span class="yiv3256073531" dir="ltr" id="yui_3_7_2_1_1372850539044_9086" style="color: #666666; font-size: 12px; line-height: 16px; outline: rgb(0,0,0); text-decoration: none;"><a href="http://www.blogger.com/blogger.g?blogID=3371915898459901668" id="yui_3_7_2_1_1372850539044_9085" rel="nofollow" target="_blank">http://www.facebook.com.br/pgdaycampinas</a></span></div>
<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com1tag:blogger.com,1999:blog-3371915898459901668.post-22424121964826303472013-06-17T08:27:00.003-03:002013-06-17T08:27:36.737-03:00Formatação de Data e Hora com as funções TO_CHAR e TO_DATEDados do tipo data e hora apresentam muitas variações de formatação. Para o usuário as datas se apresentam como campos textuais, mas para o SGBD, são tipos de dados específicos, com características próprias, representando valores temporais. Para trabalhar com valores deste tipo, os sistemas fazem frequentemente conversões entre esses dois tipos.<br />
<br />
Este post apresenta o uso das funções TO_DATE e TO_CHAR para formatar e tratar datas e horas.<br /><br /><b>* TO_CHAR - Formatando campos do tipo data para texto.</b><br /><br />- Exemplo 1: Formatação padrão<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_date, 'DD-MM-YYYY'); <br /> to_char <br />------------<br /> 17-06-2013<br />(1 registro)</b><br />- Exemplo 2: Formatação padrão utilizando o separador "/"<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_date, 'DD/MM/YYYY'); <br /> to_char <br />------------<br /> 17/06/2013<br />(1 registro)</b><br />- Exemplo 3: Alterando a ordem de visualização do mês, dia e ano apresentados.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_date, 'DD-MM-YYYY'), TO_CHAR(current_date, 'MM-DD-YYYY'), TO_CHAR(current_date, 'YYYY-MM-YY'); <br /> to_char | to_char | to_char <br />------------+------------+------------<br /> 17-06-2013 | 06-17-2013 | 2013-06-13<br />(1 registro)</b><br />- Exemplo 4: Separando mês, dia e ano em campos distintos.<br /><br /><b><span style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_date, 'DD') AS DIA, TO_CHAR(current_date, 'MM') AS MES, TO_CHAR(current_date, 'YYYY') AS ANO; </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> dia | mes | ano </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">-----+-----+------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 17 | 06 | 2013</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(1 registro)</span></b><br />- Exemplo 5: Apresentando o mês e o dia por extenso.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_date, 'DAY') AS DIA, TO_CHAR(current_date, 'MON') AS MES; <br /> dia | mes <br />-----------+-----<br /> MONDAY | JUN<br />(1 registro)</b><br />- Exemplo 6: Apresentando a hora do sistema formatada.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_timestamp, 'HH24:MI:SS'); <br /> to_char <br />----------<br /> 07:29:13<br />(1 registro)<br /></b>- Exemplo 7: Separando hora, minuto e segundos em camops distintos.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_CHAR(current_timestamp, 'HH24'), TO_CHAR(current_timestamp, 'MI'), TO_CHAR(current_timestamp, 'SS'); <br /> to_char | to_char | to_char <br />---------+---------+---------<br /> 07 | 29 | 13<br />(1 registro)</b><br />- Exemplo 8: Usando TO_CHAR para inserção e atualização de dados.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# <br />postgres=# CREATE TABLE char_date_tst (momento varchar(10));<br />CREATE TABLE<br />postgres=# INSERT INTO char_date_tst (momento) VALUES (TO_CHAR(current_date, 'MM-DD-YYYY'));<br />INSERT 0 1<br />postgres=# UPDATE char_date_tst SET momento = '01-05-2010' WHERE momento = TO_CHAR(current_date, 'MM-DD-YYYY');<br />UPDATE 1<br />postgres=# SELECT * FROM char_date_tst;<br /> momento <br />------------<br /> 01-05-2010<br />(1 registro)<br /></b><b>* TO_DATE - Formatando campos do tipo texto para data.</b><br /><br />- Exemplo 1: Usando TO_DATE para data em formato DD-MM-YYYY.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_DATE('30-04-2010', 'DD-MM-YYYY');<br /> to_date <br />------------<br /> 2010-04-30<br />(1 registro)</b><br />- Exemplo 2: Usando TO_DATE para data em formato MM-DD-YYYY.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_DATE('04-30-2010', 'MM-DD-YYYY');<br /> to_date <br />------------<br /> 2010-04-30<br />(1 registro)</b><br />- Exemplo 3: Usando TO_DATE para data com separador "/"<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_DATE('04/30/2010', 'MM/DD/YYYY');<br /> to_date <br />------------<br /> 2010-04-30<br />(1 registro)</b><br />- Exemplo 4: Teste de igualdade entre datas de formatos distintos usando TO_DATE.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# SELECT TO_DATE('04-30-2010', 'MM-DD-YYYY') = TO_DATE('30-04-2010', 'DD-MM-YYYY') AS IGUALDADE;<br /> igualdade <br />-----------<br /> t<br />(1 registro)</b><br />- Exemplo 5: Usando TO_DATE para inserção e atualização de dados.<br /><br /><b style="font-family: "Courier New",Courier,monospace;">postgres=# CREATE TABLE date_tst (momento date);<br />CREATE TABLE<br />postgres=# INSERT INTO date_tst VALUES (TO_DATE('04-30-2010', 'MM-DD-YYYY'));<br />INSERT 0 1<br />postgres=# UPDATE date_tst SET momento = momento + 1 WHERE momento = TO_DATE('04-30-2010', 'MM-DD-YYYY');<br />UPDATE 1<br />postgres=# SELECT * FROM date_tst;<br /> momento <br />------------<br /> 2010-05-01<br />(1 registro)<br /></b><b>* Considerações Finais</b><br /><br />Os exemplos acima não cobrem todas as possibilidades, mas podem ajudar nas principais operações que lidem com a formatação de datas e horas no postgresql. A cláusula CAST é uma alternativa para conversão entre estes tipos de dados, mas não realiza formatações sobre os mesmos.<br />
<br />
Para a tratar a formatação de timestamps e números, podem ser utilizadas as funções TO_TIMESTAMP e TO_NUMBER, que estão fora do escopo deste post.<br />
<br /><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com1tag:blogger.com,1999:blog-3371915898459901668.post-21881851754552498662013-05-24T10:06:00.000-03:002013-05-24T10:14:47.082-03:00PgDay Ceará 2013: Avaliação e Lições Aprendidas...<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJBNdJWQw1LdoTKAUpq40uakczIB3T3IWgL_vi91clF9-UMR2kQV_3c6Vb512xO0emFoqZr6KnbwkV0a-8NSFuCKe07kJhRkjjwvHNqW9eva9-hOHrEWrJ35d5kVuO4QjZXxgwX___l5c/s1600/pgday_ce_2013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="79" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTJBNdJWQw1LdoTKAUpq40uakczIB3T3IWgL_vi91clF9-UMR2kQV_3c6Vb512xO0emFoqZr6KnbwkV0a-8NSFuCKe07kJhRkjjwvHNqW9eva9-hOHrEWrJ35d5kVuO4QjZXxgwX___l5c/s320/pgday_ce_2013.png" width="320" /></a> </div>
<br />
Realizado dia 3 de maio deste ano, o PgDay Ceará 2013 reuniu estudantes e profissionais interessados no banco de dados PostgreSQL. Este post apresenta uma breve avaliação e algumas lições aprendidas.<br />
<br />
<b>Agradecimentos</b><br />
<br />
Em primeiro lugar, agradeço a todos os que ajudaram de alguma forma, e não são poucas pessoas, dos quais citarei apenas alguns nominalmente.<br />
<br />
Em primeiro lugar, agradeço aos companheiros da comissão de organização, formada pelos professores Adail Nunes e Daniel Siqueira.<br />
<br />
Agradecimentos à Unichristus por hospedar este evento, dando condições para a comissão organizadora trabalhar com flexibilidade e recursos.<br />
<br />
Agradecimentos adicionais ao Crispim, funcionário da Unichristus que cuidou do site do evento, e ao pessoal do departamento de artes que criou as imagens, cartazes e demais materiais de divulgação. Cito ainda o professor Ricardo pelas sugestões.<br />
<br />
A vasta divulgação que o evento recebeu de pessoas, de blogs, de sites diversos e do jornal "O Povo" nós dificilmente teremos como retribuir. Agradecimentos especiais a <a href="http://pessoalex.wordpress.com/2013/04/17/pgday-ceara-2013/" target="_blank">Alex Souza</a>, ao <a href="http://linuxecia.dihitt.com/n/tutoriais/2013/05/21/psl-brasil--pgday-ceara-movimenta-fortaleza--software-livre-7" target="_blank">portal diHITT</a>, ao <a href="http://www.infoblogs.com.br/view.action?contentId=274811" target="_blank">InfoBlogs</a>, ao <a href="http://www.softwarelivre.gov.br/eventos/eventos-2013" target="_blank">portal de software livre do governo brasileiro</a>, ao <a href="http://savepoint.blog.br/pgday_ce_2013/" target="_blank">blog Savepoint</a>, ao <a href="http://www.infoq.com/br/news/2013/04/postgresql-pgdayce2013" target="_blank">portal InfoQ</a>, ao <a href="http://www.opovo.com.br/app/opovo/tendencias/2013/05/02/noticiasjornaltendencias,3049166/pgday-ceara-2013-reune-comunidades-academicas-para-debater-postgresql.shtml" target="_blank">jornal OPovo</a>, entre tantos outros que não temos espaço para citar, ao pessoal do twitter e facebook! <br />
<br />
O PgDay teve mais de 12000 entradas no google. Obrigado!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj79NYRkue9QnQ9hOWkebkWv1MWFBziFAQQN64BO0t1h39pRRtw3_RmwRYTmK5DQN50jET2P8qSP57OeifQC-wpt13-YeGeuMKn49a7XeCeKMhtD1SMgnbNSW7zeEN6HY5YzkHeBU4tfzRe/s1600/Captura_de_tela-%22pgday+cear%C3%A1+2013%22+-+Pesquisa+Google+-+Chromium.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj79NYRkue9QnQ9hOWkebkWv1MWFBziFAQQN64BO0t1h39pRRtw3_RmwRYTmK5DQN50jET2P8qSP57OeifQC-wpt13-YeGeuMKn49a7XeCeKMhtD1SMgnbNSW7zeEN6HY5YzkHeBU4tfzRe/s320/Captura_de_tela-%22pgday+cear%C3%A1+2013%22+-+Pesquisa+Google+-+Chromium.png" width="320" /></a></div>
<div style="text-align: center;">
<b>Divulgação na Internet</b></div>
<br />
<br />
Aos palestrantes, que investiram o próprio tempo e dinheiro para estar no PgDay Ceará 2013, a minha reverência. Vocês deram um show!<br />
<br />
A você que se inscreveu no evento e que esteve presente, mesmo parcialmente, mesmo virtualmente pela câmera do prof. Daniel, meus agradecimentos entusiasmados! <br />
<br />
<b>Lições Aprendidas</b><br />
<br />
Acho importante registrar algumas lições aprendidas, algumas por erros, a maioria felizmente pelo bom andamento das atividades do Pgday:<br />
<br />
<b>1 - É vantajoso ter uma instituição que dê suporte</b><br />
<br />
O fato de termos o apoio da Unichristus para este evento garantiu não só acesso a recursos materiais, como auditório e projetor multimídia, como apoio dos professores e a presença dos alunos.<br />
<br />
O lanche oferecido à tarde e à noite, os certificados emitidos aos palestrantes e os certificados digitais em produção para os participantes foram algumas das contribuições que a instituição ofereceu ao evento.<br />
<br />
<b>2 - Patrocinadores Ajudam se o Evento for Planejado e Formalizado com muita Antecedência</b><br />
<br />
Não utilizamos patrocinadores para o PgDay Ceará, uma vez que esta foi a primeira edição no estado, mas se fosse preciso fazer esta prospecção, precisaríamos de muita antecedência e planejamento mais formalizado para obtermos melhores resultados com potenciais patrocinadores. <br />
<br />
Dois ou três meses podem ser insuficientes para captar recursos, especialmente se o seu patrocinador for um órgão federal.<br />
<br />
<b>3 - Organizar-se é Vital</b><br />
<br />
Nossa planilha de tarefas, criada no google docs, chegou a mais de 20 itens. Cada tarefa tinha seu responsável designado e prazo para realização. Sem a formalização das tarefas, não conseguiríamos integrar os esforços de todos. Nossa proposta inicial era realizar o evento em um curso prazo, e só foi possível pela organização e trabalho em equipe.<br />
<br />
<b>4 - Divulgar é Preciso!</b><br />
<br />
Após o PgDay recebi algumas mensagens de gente que não pôde estar presente. Mas não recebi nenhuma de gente que não soube do evento. A internet, as redes sociais e seus amigos são boas formas de divulgar o evento.<br />
<br />
Quando você achar que já divulgou o suficiente, continue divulgando!<br />
<br />
<b>5 - Palestrantes São Essenciais</b><br />
<br />
O palestrante é a alma de um PgDay. Fazer chamada de palestras com antecedência e ter algum dinheiro em caixa para pagar ao menos a passagem dos palestrantes são boas práticas. Convidar pessoas da sua rede social também é uma boa ideia.<br />
<br />
Em último caso, o organizador também acaba tendo de ser palestrante, não se surpreenda se isso acontecer :)<br />
<br />
<b>6 - O Público é o Alvo</b>
<br />
<br />
Se o palestrante é a alma do evento, sem público, o PgDay não tem corpo, não deixa consequências para a sociedade. Colocar um formulário simplificado de inscrições permitiu o envio por e-mail de lembretes aos inscritos, o que aumentou a taxa de presentes.<br />
<br />
O lanche oferecido à tarde a à noite aumentou a permanência dos presentes no evento. <br />
<br />
Outra ideia boa foi hospedar o evento em uma instituição de ensino, cujos alunos passam a ser potenciais participantes.<br />
<br />
<b>Avaliação</b><br />
<br />
O número de presentes foi condizente com outros PgDays realizados pelo Brasil afora, então fiquei satisfeito com relação ao número de presentes.<br />
<br />
Os participantes, palestrantes e organizadores me passaram feedbacks positivos, então creio que a satisfação dos envolvidos foi obtida, o que creio que é o melhor indicador que podemos obter inicialmente.<br />
<br />
Espero poder observar consequências futuras nos trabalhos de pesquisa e conclusão dos alunos e que isso se reflita no trabalho dos participantes de Fortaleza, Sobral, Messejana, Maracanaú e do Rio Grande do Norte. <br />
<br />
Encerro este post com fotos selecionadas do <a href="http://www.cledson.eti.br/fotogaleria.php?pasta=6" target="_blank">site do Cledson</a>.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV3qPgJKWFXRdeNvwTu10CV0Gh2Uo6yLZEZiTVOjtfJUV8WzAh11w-zS01VNn6oxauZVNv9Kzk-EE6vwxa4ZV3MUpqo1BNe_H52XIqjWfrsytwcfmpqqIiZEZ4BqyXqFY_S1v1wFF0c8xg/s1600/pgday-09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV3qPgJKWFXRdeNvwTu10CV0Gh2Uo6yLZEZiTVOjtfJUV8WzAh11w-zS01VNn6oxauZVNv9Kzk-EE6vwxa4ZV3MUpqo1BNe_H52XIqjWfrsytwcfmpqqIiZEZ4BqyXqFY_S1v1wFF0c8xg/s320/pgday-09.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: center;">
<b>Público seleto.</b></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDjYeA71KFiE0roqQPT1d1aHBgYhZqaXOZGqSUczkC9kMVsHPtwX2h93fCLJ4XwoJCA6iCdIBSrFGRupEn-lcNXiVWw2yZhcNLH0yERkxvLDtSoNodka3lbPMLAcBqh-lsAmqfi_TTP1yo/s1600/pgday-2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDjYeA71KFiE0roqQPT1d1aHBgYhZqaXOZGqSUczkC9kMVsHPtwX2h93fCLJ4XwoJCA6iCdIBSrFGRupEn-lcNXiVWw2yZhcNLH0yERkxvLDtSoNodka3lbPMLAcBqh-lsAmqfi_TTP1yo/s320/pgday-2.jpg" width="320" /></a></div>
<br />
<div style="text-align: center;">
<b>Fábio Telles dá um Show</b></div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibLD40FgM-alhll06CPAmxSrx7g_B4yDsuotL0VXGIXiBUu0hyDp3Q2sOjQ64eooalMXJCtQ6sl9s5JBVj6YcP-xSSfRbtTDqVPp5Kd3D0OAAUtxX5aapk__UlmYJ1qP7WuF7254qCtkag/s1600/pgday-5.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibLD40FgM-alhll06CPAmxSrx7g_B4yDsuotL0VXGIXiBUu0hyDp3Q2sOjQ64eooalMXJCtQ6sl9s5JBVj6YcP-xSSfRbtTDqVPp5Kd3D0OAAUtxX5aapk__UlmYJ1qP7WuF7254qCtkag/s320/pgday-5.jpg" width="320" /></a></div>
<br />
<div style="text-align: center;">
<b>Não podia faltar uma foto da minha palestra!</b></div>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiVYJput8N9x1dO8ksi0Q_EluorMC-uR97K3UoBjRIxgedB7NuozM4tp_WzJPdVmNrAM8WAmpF0ciMDnTGXOliZAoAp9tS9pnI9P297lBxpo5axp0Q_bAAA71XJPyOd7Vnl_B35GAxDw-V/s1600/pgday-7.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiVYJput8N9x1dO8ksi0Q_EluorMC-uR97K3UoBjRIxgedB7NuozM4tp_WzJPdVmNrAM8WAmpF0ciMDnTGXOliZAoAp9tS9pnI9P297lBxpo5axp0Q_bAAA71XJPyOd7Vnl_B35GAxDw-V/s320/pgday-7.jpg" width="320" /></a></div>
<div style="text-align: center;">
<b>Nabuconosor Coutinho fala Tudo sobre Replicação</b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA_V572SEXQzKhOl5aSMNLcwKht1iP4aZ8B93vz16Cuj-SkRmOvXkN2Mgkf9m47E4NELMtISfJ0VnsU872wQA__WF4WiNLKmZM1gaaW0AnaLAXE3dZRIL15NblxR-bmPPF8iXXbPrW96Wp/s1600/pgday-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA_V572SEXQzKhOl5aSMNLcwKht1iP4aZ8B93vz16Cuj-SkRmOvXkN2Mgkf9m47E4NELMtISfJ0VnsU872wQA__WF4WiNLKmZM1gaaW0AnaLAXE3dZRIL15NblxR-bmPPF8iXXbPrW96Wp/s320/pgday-4.jpg" width="320" /></a></div>
<div style="text-align: center;">
<b>Palestra e Demonstração sobre Bancos de Dados Espaciais com Marx Haron, do Serpro</b></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<br />
<br />
<br />
<br /><div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-60664390561732603722013-05-21T07:52:00.002-03:002013-05-21T07:52:19.026-03:00PgBR 2013: Inscrições Abertas!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPdJJ7fBuLtINi1byMWBpRO89NVbnJVXr3mM1XAG-34oBjzMmSmZjYmdTTNe1R5z3TVg9_69LLsUl2JwuojrYzoIItZrLGIPDZ5lKeB_pPxlThpf9EH7-VVYP-uHKx2k6OR4WzM2qTyH-H/s1600/pgcon_2008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPdJJ7fBuLtINi1byMWBpRO89NVbnJVXr3mM1XAG-34oBjzMmSmZjYmdTTNe1R5z3TVg9_69LLsUl2JwuojrYzoIItZrLGIPDZ5lKeB_pPxlThpf9EH7-VVYP-uHKx2k6OR4WzM2qTyH-H/s320/pgcon_2008.jpg" width="320" /></a></div>
<br />
A Conferência Brasileira de PostgreSQL, denominada <b>PGBR</b>, é o principal
evento organizado pela Comunidade Brasileira de PostgreSQL. Trata-se de
um acontecimento que reúne desenvolvedores, usuários e pesquisadores da
tecnologia de banco de dados livre e de código aberto PostgreSQL.<br />
<br />
Estão <b>abertas as inscrições para a edição 2013</b> deste grande evento, que será realizado em agosto, na bela cidade de Porto Velho, em Rondônia. A grade de apresentações, informações sobre inscrições e demais informações podem ser vistas <a href="http://pgbr.postgresql.org.br/2013/evento.php" target="_blank">aqui</a>.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-9622977771651723102013-04-16T13:09:00.003-03:002013-04-16T15:53:00.128-03:00PgDAy Ceará 2013: Grade de Palestras Definida!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJPJn9EUfkKUJlChLrhhghhoFijnTx-EIjNHJD-p2zikgMAIKUQbbsKe_L_YYsBtb6EG5S2VaRib4d717kaKSHwYUMPfu_GyRVRDpfa2f5_YmRWptoJabAywv85jSGUmr_S1kqKlreSomG/s1600/logo_topo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="79" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJPJn9EUfkKUJlChLrhhghhoFijnTx-EIjNHJD-p2zikgMAIKUQbbsKe_L_YYsBtb6EG5S2VaRib4d717kaKSHwYUMPfu_GyRVRDpfa2f5_YmRWptoJabAywv85jSGUmr_S1kqKlreSomG/s320/logo_topo.png" width="320" /></a></div>
<br />
A grade de palestras do PgDay Ceará 2013 já está definida. Informações e inscrições gratuitas estão disponíveis <a href="http://www.fchristus.com.br/pgdayceara2013/home.php" target="_blank">aqui</a>.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-78641254627431698122013-04-05T15:00:00.000-03:002013-04-05T15:00:22.510-03:00Trate com BLOBs e CLOBs Diretamente no PSQL!<br />
Armazenar grandes objetos binários (<i>Binary Large Objects</i> - BLOBs), tais como vídeos, imagens e arquivos PDF, e grandes objetos textuais (<i>Character Large Objects</i> - CLOBs) em um banco de dados é uma atividade que pode apresentar dificuldade maior que a vivenciada em se lidar com tipos de dados tradicionais.<br />
<br />
Cada SGBD apresenta sua padronização e o PostgreSQL apresenta seus métodos de armazenamento, exclusão e recuperação de BLOBs e CLOBS. A portabilidade entre SGBDs não costuma ser fácil neste caso.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs2v5kE_sWxwABVRhlvidTYqoaBRANSQztyVRqW1n0x_v3EskqMKXOFiwOeWHDq46MD7rbOkOl2_pdRPzdA6R3DSLBdkcbkdOTfGat-Zbl4E1OIyw392Gh3qwKHMmyESOqO5jdPY3tMDRq/s1600/lob.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs2v5kE_sWxwABVRhlvidTYqoaBRANSQztyVRqW1n0x_v3EskqMKXOFiwOeWHDq46MD7rbOkOl2_pdRPzdA6R3DSLBdkcbkdOTfGat-Zbl4E1OIyw392Gh3qwKHMmyESOqO5jdPY3tMDRq/s1600/lob.jpg" /></a></div>
<div style="text-align: center;">
<b> Lidar com Large Objects pode não ser tão trivial!</b></div>
<br />
<br />
Um recurso bastante simples para lidar com estes grandes objetos dentro do postgres é disponibilizado de dentro do psql, objeto deste post.<br />
<br />
Quatro funções permitem operações sobre large objects, viabilizando a sua criação, recuperação, consulta e exclusão:<br />
- <b>\lo_import ARQUIVO [COMENTÁRIO]</b> - Importa um arquivo do filesystem (levando em conta a search_path) para o postgresql, atribuindo ao mesmo um identificador de objeto (OID) e um comentário, quando fornecido este parâmetro<br />- <b>\lo_list</b> - Apresenta uma listagem dos objetos binários importados<br />
- <b>\lo_export OIDLOB ARQUIVO</b> - Exporta um BLOB ou CLOB do postgres para o filesystem sem removê-lo do postgresql, referenciando-o pelo seu OID<br />- <b>\lo_unlink OIDLOB</b> - Elimina um large object do postgresql com base no seu OID.<br />
<br />
Abaixo, sem a preocupação de esgotar este tema, a demonstração do tratamento de BLOBs e CLOBs no postgres via psql.<br />
<br />
<b>* Listagem de grandes objetos (large objets) armazenados</b><br />
<br /><span style="font-family: "Courier New",Courier,monospace;">postgres-# \lo_list</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">Objetos grandes</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ID | Descrição </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----+-----------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(0 registro)</span><br />
<div style="font-family: "Courier New",Courier,monospace;">
<br /></div>
<b>* Recuperação dos caminhos da Serch_path, utilizados para recuperar arquivos para o psql</b><br />
<br />
<br />
<br />
<br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# SHOW search_path;</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> search_path </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">----------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> "$user",public</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(1 registro)</span><br />
<br />
<br />
<br />
<br />
<br />
<b>* Importação de Arquivos</b><br /><br />
<div style="font-family: "Courier New",Courier,monospace;">
postgres=# \lo_import arqdoc.doc<br />lo_import <span style="color: red;">16400 (OID DO NOVO ARQUIVO IMPORTADO)</span><br />postgres=# \lo_import arqpdf.doc 'Arquivo Binario PDF'<br />não pôde abrir arquivo "arqpdf.doc": Arquivo ou diretório não encontrado<br />postgres=# \lo_import arqpdf.pdf 'Arquivo Binario PDF'<br />lo_import 16401<br />postgres=# \lo_import arqpng.png 'Arquivo PNG'<br />lo_import 16402<br />postgres=# \lo_list <span style="color: red;">(LISTAGEM DE ARQUIVOS IMPORTADOS)</span><br /> Objetos grandes<br /> ID | Descrição <br />-------+---------------------<br /> 16400 | <br /> 16401 | Arquivo Binario PDF<br /> 16402 | Arquivo PNG<br />(3 registros)</div>
<br />
<b>* Exclusão de arquivo previamente importado</b><br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_unlink 16401</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">lo_unlink 16401</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_list</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Objetos grandes</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ID | Descrição </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">-------+-------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16400 | </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16402 | Arquivo PNG</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(2 registros)</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<b>* Exportação de arquivo do postgresql para o filesystem</b><br /><br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_import novofile.pdf</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">lo_import 16403</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_export 16403 testeexport.pdf (gera o arquivo </span><span style="color: red; font-family: "Courier New",Courier,monospace;">testeexport.pdf no filesystem)</span><br />
<br />
<b>* Importação de CLOB</b><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_import miniclob.txt 'Arquivo CLOB'</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">lo_import 16405</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">postgres=# \lo_list</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Objetos grandes</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ID | Descrição </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">-------+--------------</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16400 | </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16402 | Arquivo PNG</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16403 | </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16404 | </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> 16405 | Arquivo CLOB</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">(5 registros)</span><br />
<br />
<br />
<br />
<br />
<br />
<b>* Considerações Finais</b><br />
<br />
<br />Prefiro trabalhar com large objects no filesystem, ao invés de registrá-los no próprio banco de dados.O acréscimo de mais uma camada reduz a portabilidade e a velocidade de acesso, mas tende a aumentar de certa forma a segurança e a facilitar operações de backup e recovery.<br />
<br />
Caso se deseje utilizar este recurso na aplicação, utilizando as funções dentro do SQL, o postgresql apresenta o recurso das <a href="http://www.postgresql.org/docs/8.2/static/lo-funcs.html">Server-Side Functions</a>, bastante similar e que oferece maior controle.<br />
<br />
E você, como lida com os seus BLOBs e CLOBs?<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0tag:blogger.com,1999:blog-3371915898459901668.post-59058215518633379182013-03-27T08:15:00.000-03:002013-03-27T08:15:09.248-03:00Qual é o SGBD mais popular? O PostgreSQL me surpreendeu!A popularidade de uma ferramenta não garante a sua qualidade, mas é um bom indicador de sua aceitação no mercado. O site <a href="http://db-engines.com/en/ranking">DB-ENGINES</a> criou um ranking de SGBDs, utilizando uma metodologia bem estruturada que leva em conta menções em sites, buscas e ofertas de trabalho, entre outros critérios. A pontuação é atualizada mensalmente.<br />
<br />
Ver o PostgreSQL em quarto lugar no ranking do mundo (<b>03/2013</b>), me surpreendeu positivamente. Imaginava que em certos lugares, como o nosso Brasil, ele seria bem colocado, mas não achei que essa aceitação fosse mundial!<br />
<br />
O link se encontra abaixo:<br />
<br />
- <a href="http://db-engines.com/en/ranking">http://db-engines.com/en/ranking</a><br />
<br />
Faltam detalhes como rankings por critério utilizado, fornecendo informações sobre, por exemplo, ofertas de emprego por banco de dados e região, mas acho que o é uma boa curiosidade que traz alguma informação nova. Pequei a dica deste link no blog <a href="http://paposql.blogspot.com.br/">Papo SQL</a>.<div class="blogger-post-footer">Meu Blog de PostgreSQL - http://postgresqlbr.blogspot.com/
- Cláudio Bezerra Leopoldino</div>Cláudio Leopoldinohttp://www.blogger.com/profile/16676839129160419931noreply@blogger.com0