De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

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/

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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