October 21, 2008

Pl-python na prática

Filed under: postgresql — coutinho @ 8:38 pm

Durante a migração da base de dados do Detran-CE para PostgreSQL, nos deparamos com algo interessante, o uso frequente de arrays passados como parâmetros de umas funções para outras, os quais eram manipulados para compor critérios de consultas e outras coisas. O interessante que eu vi nisso foi o modo como eles trabalhavam esses arrays como se eles fossem tabelas.

Daí surgiu a necessidades de nós também no PostgreSQL manipular-mos estes arrays, como se eles fossem tabelas, assim poderiamos fazer select neles e coisas parecidas, para isso criamos uma função em pl-python chamada cast_as_table, veja abaixo a implementação e uso da função cast_as_table:

CREATE OR REPLACE FUNCTION cast_as_table(a character varying[])
  RETURNS SETOF character varying AS
$BODY$
vall = []
x = a.replace('{','').replace('}','').split(',')
ant = ''
for v1 in x:
	if v1.startswith('"'):
		ant = v1
	elif v1.endswith('"'):
		n = ant + ',' + v1
		n = n.replace('"','')
	vall.append(n)
	ant = ''
	elif ant != '':
		ant = ant + v1
	else:
		vall.append(v1)
return vall
$BODY$
  LANGUAGE 'plpythonu' VOLATILE

A função acima é um exemplo parecido com uma das que utilizamos na migração do detran,  com ela podemos fazer um cast de um array para um conjunto de registros como sugere a declaração de retorno da função.  Famos ver agora como fica o select em uma das funções que recebia como parâmetro um array de string para ser usado na montagem do critério da consulta:

select
A.SF_BOR_SIT_CODIGO,
A.MU_MUL_DATA_SITUACAO,
A.MU_MUL_SEQ_HISTORICO
from cast_as_table(P_TAB_MULTA) A into
VSF_BOR_SIT_CODIGO,
VMU_MUL_DATA_SITUACAO,
VMU_MUL_SEQ_HISTORICO
where (mult.mm_oau_codigo, mult.mu_mul_numero,mult.mu_mul_sequencial)
IN (select A2.mm_oau_codigo,A2.mu_mul_numero,A2.mu_mul_sequencial from cast_as_table(P_TAB_MULTA) A2);

O exemplo acima foi um tanto ingênuo mas em muitos casos isso pode ser bem útil pois uma vez que podemos tratar o array como um conjunto de registro podemos nos utilizar de diversos recursos como filtros com where, junções com outros conjuntos de registros, etc.

Em breve disponibilizaremos o código fonte de nossa implementação em python da utl_file que é um recurso muito utilizado no Oracle para manipulação de arquivos. Com este pacote nós conseguimos migrar de forma transparente varios objetos os quais faziam uso desse recurso nativo do oracle.

Aguardem.

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment