Pl-python na prática
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.
