você está aqui: Home  → Arquivo de Mensagens Programação Shell Linux: Inscrições Abertas

PL PGSQL Programando no PostgreSql Usando Recursividade

Colaboração: Marlon Luis Petry

Data de Publicação: 13 de August de 2008

Postgresql suporta uma variedade de linguagens procedurais, podemos programar uma store procedure na linguagens de nossa preferência como exemplos: Pl/Perl, Pl/Python, Pl/Java, Pl/PHP, Pl/Ruby e muitas outras. Para utilizar estas linguagens primeiro é necessário habilitar na base de dados.

O comando para habilitar a linguagem na base de dados não é complicado. Nesse post iremos utilizar a linguagem nativa do PostgreSQL que PL/PGSQL.

Habilitando a linguagem em uma bases de dados.

create lang plpgsql nomedabasededados

Por exemplo na base de dados book

create lang plpgsql book

Este comando deve ser executado no shell.

O exemplo tem a finalidade de mostrar o poder de um procedimento armazenado (store procedure) da linguagem PL/PGSQL está linguagem somente irá atuar dentro da base de dados, então não será possível executar comandos externos. Caso seja necessário é possível desenvolver uma função externa em C ou usar uma linguagem procedural não confiável a qual pode inserir algum risco de segurança a base de dados.

Voltando ao exemplo vamos desenvolver o algoritmo da torre de hanoi em PL/PGSQL.

view plaincopy to clipboardprint?

1. CREATE FUNCTION towerHanoi(ndisk INTEGER,src INTEGER,dst INTEGER, tmp INTEGER) RETURNS void AS '
2. Declare
3.
4. BEGIN
5.     IF ndisk = 1 THEN
6.         RAISE NOTICE '' DISK % Move da haste % para haste % '', ndisk,src,dst;
7.     ELSE
8.         perform towerHanoi(ndisk - 1,src,dst,tmp);
9.         RAISE NOTICE '' DISK % Move da haste % para haste % '', ndisk,src,tmp;
10.         perform towerHanoi(ndisk - 1,src,tmp,src);
11.     END IF;
12.
13. END;
14. ' LANGUAGE 'plpgsql';

CREATE FUNCTION towerHanoi(ndisk INTEGER,src INTEGER,dst INTEGER, tmp INTEGER) RETURNS void AS '
Declare

BEGIN
IF ndisk = 1 THEN
RAISE NOTICE '' DISK % Move da haste % para haste % '', ndisk,src,dst;
ELSE
perform towerHanoi(ndisk - 1,src,dst,tmp);
RAISE NOTICE '' DISK % Move da haste % para haste % '', ndisk,src,tmp;
perform towerHanoi(ndisk - 1,src,tmp,src);
END IF;

END;
' LANGUAGE 'plpgsql';

Executando a função

select towerHanoi(3,1,2,3);

Veja o resultado da função

NOTA: DISK 1 Move da haste 1 para haste 2
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $4 )
PL/pgSQL function  towerhanoi  line 7 at perform
comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $4 )
PL/pgSQL function  towerhanoi  line 7 at perform
NOTA: DISK 2 Move da haste 1 para haste 3
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $4 )
PL/pgSQL function  towerhanoi  line 7 at perform
NOTA: DISK 1 Move da haste 1 para haste 3
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $2 )
PL/pgSQL function  towerhanoi  line 9 at perform
comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $4 )
PL/pgSQL function  towerhanoi  line 7 at perform
NOTA: DISK 3 Move da haste 1 para haste 3
NOTA: DISK 1 Move da haste 1 para haste 3
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $4 )
PL/pgSQL function  towerhanoi  line 7 at perform
comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $2 )
PL/pgSQL function  towerhanoi  line 9 at perform
NOTA: DISK 2 Move da haste 1 para haste 1
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $2 )
PL/pgSQL function  towerhanoi  line 9 at perform
NOTA: DISK 1 Move da haste 1 para haste 1
CONTEXT: comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $2 )
PL/pgSQL function  towerhanoi  line 9 at perform
comando SQL  SELECT towerHanoi( $1 - 1, $2 , $3 , $2 )
PL/pgSQL function  towerhanoi  line 9 at perform

Total query runtime: 2 ms.
Data retrieval runtime: 7 ms.
1 rows retrieved.

Esta simples função demonstra como usar recursividade, passagem de parâmetros e como chamar uma função em PL/PGSQL.

Marlon Luis Petry - Bel. Ciência da Computação - Linux, Programação, Banco de Dados.

Configurando WAKE ON LAN no Debian

Colaboração: Ricardo Caldas

O que aconteceria se um dia você precisasse religar uma máquina que você nao tem acesso físico? Uma das soluções para esse problema é o recurso Wake on Lan(WOL) das atuais placas de rede(juntamente com a placa mãe).

Este recurso permite que quando a máquina desligue a placa de rede fique em estado como de hibernação, respondendo só a um pacote chamado MagicPacket. Para isso tudo funcionar necessário 2 programas: wakeonlan <== Para enviar o magicpacket a placa de rede(mac addr). ethtool <== Para iniciar o modulo WOL na placa de rede.

Veja um passo-a-passo detalhado aqui: http://ostrecosdeti.wordpress.com/2008/07/31/configurando-wake-on-lan-no-debian/



Veja a relação completa dos artigos de Marlon Luis Petry