quinta-feira, 11 de outubro de 2007

Jobs no PostgreSQL

Essa semana a equipe de peogramadores do detran, que está desenvolvendo um novo sistema interno usando postgreSQL precisou usar algo equivalente aos Jobs do oracle para agendarem algumas tarefas de manutenção do sistema.

Como todos sabem sempre podemos contar com o cron para coisas desse tipo, porém, um recurso integrado ao banco de dados, onde o corpo da definição dos jobs possa ser escrito diretamente em sql, facilita bastante a vida de quem tem que criar e manter esses jobs.

Baseado nisso eu fui atraz de um software do pessoal do pgadmin, o pgAgent. O incoveniente que achei foi que não tive como instalar no servidor apenas o pgagent, uma vez que esse só é distribuído junto com o pacote do pgadmin.

Após instalar o pgAdmin3 no servidor eu usei o script do pgagent para criação do banco de dados onde vão ficar armazanados os jobs:

yum install pgadmin3
su - postgres
psql -d pgagent -f /usr/share/pgadmin3/pgagent.sql
pgagent hostaddr=127.0.0.1 dbname=pgagent

Após isso infelizmente o nó Jobs não apareceu no meu pgAdmin3 1.6.3 no meu velho laptop hp rodando ubuntu edgy, mas inesplicavelmente apareceu e funcionou perfeito no pgadmin3 1.6.3 no windows do desktop do meu amigo Felipe Nogueira.

Com isso resolvemos o problema dos jobs e eu fiquei com mais vontade de comprar um laptop novo.

PgAdmin3 em português

Alguns meses atráz resolvi matar minha curiosidade de sobre o fato do pgAdmin não vir por padrão com suporte ao idioma português do Brasil.

Quando fui baixar o suporte ao pt_BR para instalar em meu pgAdmin3 (versão 1.4 ainda) vi que a tradução estava longe de ficar pronta e que por isso não é distribuida junto com o PgAdmin.

Após baixar e instalar o suporte ao pt_BR em meu pgAdmin3 (v 1.4) percebi que na verdade a tradução estava num percenual menor que o informado no site do projeto e que esse percentual de tradução para o pgAdmin3 v 1.6 era ainda menor.

Diante deste cenário eu me vi motivado a "botar a mão na massa". Foram algumas horas de sono perdidas (o meu amigo Euler que me ajudou revisando que o diga). Em algum tempo conseguimos levar a tradução do pgAdmin3 de algo em torno de 40 ou 50% a 96% das string traduzidas e revisadas.

Hoje o postgreSQL Brasil atravéz de mim e de outros colaboradores (que vão aparecer ainda com fé em deus) mantém a tradução do PgAdmin3 para potuguês do Brasil.

Infelizmente não temos acompanhado a tradução das novas strings para a versão 1.8 do pgAdmin3 que deverá sair em pouco tempo, provavelmente junto com o PostgreSQL 8.3, mas até lá quem sabe a gente consiga fechar os 4% que faltam da versão 1.6 e logo em seguida corremos atraz da 1.8.

Quem se interessar pelo projeto, poderá encontrar em nossa página (http://www.postgresql.org.br/PgAdmin3) o download de pacotes .zip e .deb (debian, ubuntu, kurumin e afins) e também o arquivo com as strings para tradução.


Quem desejar colaborar com a deve entrar em contato comigo pelo e-mail coutinho.php _arroba_ gmail.com

terça-feira, 9 de outubro de 2007

Variaveis de sessão usando Pl Python

Olá pessoal, vamos apresentar aqui como implementar no postgreSQL um recurso de variáveis de sessão, que pode ser inclusive usado para "substituir" o uso das variáveis de pacotes do oracle.

Primeiro fizemos a intalação do plpython no fedora 7

wget http://ftp.gui.uva.es/sites/fedora.redhat.com/linux/updates/7/i386/postgresql-plpython-8.2.4-1.fc7.i386.rpm
rpm -ivh postgresql-plpython-8.2.4-1.fc7.i386.rpm



Em seguida instalamos a plpython no banco de dados de trabalho:

createlang plpythonu detran


A pl python tem um recurso interessante que é um dicionário de dados de acesso global dentro de uma sessão, com isso podemos criar 2 funções em python set_session e get_session que vão fazer o trabalho de setar e ler essas variáveis em qualquer local que venhamos a precisar.

Para setar as informações de sessão em python usamos:

GD["nome_var"] = "valor"

para ler o valor da variável usamos apenas

GD["nome_var"]


Abaixo as funcões para gravar e ler as variáveis.

CREATE OR REPLACE FUNCTION set_session(var1 "varchar", var2 "varchar")
RETURNS bool AS
$$
GD[args[0]] = args[1]
return True
$$
LANGUAGE 'plpythonu' VOLATILE;

CREATE OR REPLACE FUNCTION get_session(var1 "varchar")
RETURNS varchar AS
$$
return GD[args[0]]
$$
LANGUAGE 'plpythonu' VOLATILE;


Para testar:
select set_global('nome','coutinho'); # retorna true se nao der pau
select get_global('nome'); # retorna 'coutinho'

sexta-feira, 5 de outubro de 2007

NVL parte 2

Descobrimos depois o tipo anyelement, agora a função NVL pode ser escrita também da forma abaixo, dispensando a sobrecarga

CREATE OR REPLACE FUNCTION nvl (anyelement, anyelement) RETURNS anyelement AS
$body$
select coalesce($1,$2);
$body$ language 'sql';

quinta-feira, 4 de outubro de 2007

Exportação da estrutura do banco de dados - parte 1

Olá pessoal, nesse meu primeiro post aqui Postmaster Ceará eu vou falar sobre o ora2pg, que é uma ferramenta escrita em perl que facilita um bocado a vida de quem tem que migrar uma base de dados do Oracle para o PostgreSQL.

O ora2pg se conecta ao banco de dados pode exportar a estrutura e os dados para um script sql ou direto para dentro de uma base de dados PostgreSQL.

É fácil testar o ora2pg e ver sua eficiência, para isso vamos precisar de:

  • banco de dados oracle com alguns objetos
  • banco de dados postgresql vazio

Na máquina onde iremos rodar o ora2pg precisaremos de:
  • perl
  • oracle cliente
  • modulo DBD do perl para conexão com oracle

Então vamos parar de papo e vamos baixar o ora2pg, instalar, configurar e exportar nosso banco de dados de teste do oracle para o postgreSQL . Supondo que você use um sistema operacional descente, a gente poderia fazer assim

Baixar o ora2pg
wget http://freshmeat.net/redir/ora2pg/20708/url_tgz/ora2pg-4.5.tar.gz

Baixar o driver perl de aceso ao oracle (DBD::Oracle)
wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.19.tar.gz

Baixar o driver perl de aceso ao PostgreSQL (DBD::Pg)
wget http://search.cpan.org/CPAN/authors/id/D/DB/DBDPG/DBD-Pg-1.49.tar.gz


Instalar o DBD::Oracle
tar zxvf DBD-Oracle-1.19.tar.gz
cd DBD-Oracle-1.19
perl Makefile.PL
make
make install

Instalar o DBD::Pg
tar zxvf DBD-Pg-1.49.tar.gz
cd DBD-Pg-1.49
perl Makefile.PL
make
make install

O ora2pg na realidade não necessita de nenhum proceso de instalação e a única coisa que precisamos fazer para usa-lo é descompactalo em algum lugar:

tar zxvf ora2pg-4.5.tar.gz


Com isso agora nós poderíamos inicar o porceso de configuração e testar a exportação de nossa base de dados, mas para dar um pouco mais de audiência ao blog isso vai ficar para a "parte 2" desse pequeno tutorial.

quarta-feira, 3 de outubro de 2007

Operação de Divisão

Algumas dicas para operação de divisão:

select 5 / 2; ==> 2

select 5::float /2; ==> 2.5

select 5::float / 2::float; ==> 2.5

select 5.0 / 2.0; ==> 2.5

terça-feira, 2 de outubro de 2007

Conexão do PostgreSQL com o Java

No DETRAN-CE, os sistemas finalísticos foram desenvolvidos em Java, para testar a conexão do PostgreSQL com o Java podem ser utilizados inúmeros clientes de gerenciamento ou modelagem do PostgreSQL. No exemplo que vou mostrar abaixo, utilizei o driver JDBC. O driver JDBC a ser utilizado deve estar de acordo com a versão do PostgreSQL, entretanto temos instalado a versão 8.2.4 do banco e nos testes ela só funcionou com o driver 8.1-410.jdbc3, quando o correto seria utilizar a versão 8.2-506.jdbc4. Ainda estou realizando mais alguns uns testes para entender o que ocorreu.No exemplo abaixo criei uma tabela com dados de livros (id, nome, autor, editor, ano) e me conectei ao postgres para retornar uma consulta simples.

// início da aplicação

import java.sql.*;
public class SQLStatement {
public static void main(String args[]) {
String url = "jdbc:postgresql://host:5432/nomedobanco";
Connection con;
String query = "select * from nomedoesquema.nomedatabela";
Statement stmt;
try {
Class.forName("org.postgresql.Driver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url,"login", "senha");
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
int rowCount = 1;
System.out.println("Cadastro de Livros");
while (rs.next()) {
System.out.println("Livro " + rowCount);
for (int i = 1; i <= numberOfColumns; i++) {
System.out.print(" Campo " + i + ": ");
System.out.println(rs.getString(i));
}
System.out.println("");
rowCount++;
}
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.print("SQLException: ");
System.err.println(ex.getMessage());
}
}
}

// fim da aplicação

  • RESULTADO DA EXECUÇÃO UTILIZANDO O JDBC 8.1-410.jdbc3

Cadastro de Livros
Livro 1
Campo 1: 3
Campo 2: Estratégia empresarial : tendências e desafios
Campo 3: TACHIZAWA
Campo 4: Makron Books
Campo 5: 2000

Livro 2
Campo 1: 2
Campo 2: Como inovar na empresa através da tecnologia da informação
Campo 3: DAVEPORT
Campo 4: Campus
Campo 5: 1994

Livro 3:
Campo 1: 1
Campo 2: O Planej Estratégico dentro do Conceito de Adm Estratégica
Campo 3: ALDAY
Campo 4: FAE
Campo 5: 2006


  • RESULTADO DA EXECUÇÃO UTILIZANDO O JDBC 8.2-506.jdbc4

Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(
Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(
Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(
Native Method)
at java.lang.Class.forName(Unknown Source)
at SQLStatement.main(
SQLStatement.java:11)

by TemplatesForYouTFY
SoSuechtig, Burajiru