<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Portage</title>
	<atom:link href="http://coutinho.mondriantecnologia.com/feed" rel="self" type="application/rss+xml" />
	<link>http://coutinho.mondriantecnologia.com</link>
	<description>Software Livre, Migração, PostgreSQL e outras coisinhas mais...</description>
	<pubDate>Sat, 07 Mar 2009 18:05:19 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>PostgreSQL Window Functions</title>
		<link>http://coutinho.mondriantecnologia.com/archives/59</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/59#comments</comments>
		<pubDate>Sat, 07 Mar 2009 01:46:50 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=59</guid>
		<description><![CDATA[Como o David Feeter me prometeu na pg-con ano passado o pessoal do postgreSQL implementou as famosas window functions. As &#8220;windows&#8221; são os dados &#8220;sobre&#8221; os quais você irá trabalhar. Daí o nome window e daí também o noe da mais famosa delas over.
Um exemplo simples tirado direto da documentação oficial do 8.4 pode nos [...]]]></description>
			<content:encoded><![CDATA[<p>Como o David Feeter me prometeu na pg-con ano passado o pessoal do postgreSQL implementou as famosas window functions. As &#8220;windows&#8221; são os dados &#8220;sobre&#8221; os quais você irá trabalhar. Daí o nome window e daí também o noe da mais famosa delas over.</p>
<p>Um exemplo simples tirado direto da documentação oficial do 8.4 pode nos ajudar a entender o que isso significa na pratica.</p>
<p>SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;<br />
depname  | empno | salary |          avg<br />
&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;-+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
develop     |    11|   5200 | 5020.0000000000000000<br />
develop     |     7 |   4200 | 5020.0000000000000000<br />
develop     |     9 |   4500 | 5020.0000000000000000<br />
develop     |     8 |   6000 | 5020.0000000000000000<br />
develop     |    10|   5200 | 5020.0000000000000000<br />
personnel  |     5 |   3500 | 3700.0000000000000000<br />
personnel  |     2 |   3900 | 3700.0000000000000000<br />
sales          |     3 |   4800 | 4866.6666666666666667<br />
sales          |     1 |   5000 | 4866.6666666666666667<br />
sales          |     4 |   4800 | 4866.6666666666666667<br />
(10 rows)<br />
O que vemos aí é que foi pedido para calcular a média dos salarios &#8220;em cima do departamento&#8221;. Algo parecido com um agrupamento pelo departamento, só que sem agrupar na verdade. Com o uso da função partition by o que nós fizemos foi o seguinte, pedimos que o resultado fosse particionado ao invéz de agrupado.</p>
<p>A diferença entre particionar e agrupar é que no particionamento nós mostramos o resultado de nossa função de agregação (avg) para cada uma das linhas que nos fizeram chegar a esse resultado. No caso de um agrupamento nós traríamos apenas a média por desses salários por setor.</p>
<p>Em muitos casos pode ser útil ver não só a media dos salários por setor mas ainda cada linha que nos fez chegar a essa média.</p>
<p>Outro caso o qual me deparei varias vezes em uma migração foi o que a funcao escrita em Pl/SQL precisava apenas mostrar um numero de linha que deveria reinicar a cada mudança de um determinado campo.</p>
<p>Ex:</p>
<p>row_number() | funcionario | setor<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
1                      | coutinho     | db<br />
2                      | magno        | db<br />
3                      | marcos       | db<br />
1                      | joao            | desenvolvimento<br />
2                      | chico          | desenvolvimento<br />
3                      | jose            | desenvolvimento<br />
4                      | paulo          | desenvolvimento<br />
(7 rows)</p>
<p>Isso é o resultado de um:</p>
<p>select row_numer() over(partition by setor), funcionario, setor from vw_funcionario_por_setor</p>
<p>Isso que nos dizer que queremos o numero de cada linha dentro da janela delimitada pelo setor.</p>
<p>O resultado visual é uma sequencia numérica que é reiniciada quando muda de setor.</p>
<p>Essas funções me fizeram muita falta, estou ancioso pelo 8.4.</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/59/feed</wfw:commentRss>
		</item>
		<item>
		<title>Plugin para usar esquemas do PostgreSQL com JRuby</title>
		<link>http://coutinho.mondriantecnologia.com/archives/55</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/55#comments</comments>
		<pubDate>Tue, 03 Feb 2009 02:11:30 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=55</guid>
		<description><![CDATA[Se alguém aqui já teve que fazer uma aplicação razoavelmente grande com rails e PostgreSQL, ou se mesmo sem a aplicação ser muito grande teve necessidade usar os “esquemas” do postgresql, viu que o rails, mesmo com o ruby, tem alguma dificuldade para trabalhar com eles.
Usando rails 1.x você podia usar algo como:
set_table_name “financeiro.pagamentos”
Já usando [...]]]></description>
			<content:encoded><![CDATA[<p>Se alguém aqui já teve que fazer uma aplicação razoavelmente grande com rails e PostgreSQL, ou se mesmo sem a aplicação ser muito grande teve necessidade usar os “esquemas” do postgresql, viu que o rails, mesmo com o ruby, tem alguma dificuldade para trabalhar com eles.</p>
<p>Usando rails 1.x você podia usar algo como:</p>
<p>set_table_name “financeiro.pagamentos”</p>
<p>Já usando o rails 2.x isso gera um erro nas consultas no postgresql pois em um find normal a consulta é montada assim:</p>
<p>select * from “financeiro.pagamentos”</p>
<p>ao invés de</p>
<p>select * from “financeiro”.“pagamentos”</p>
<p>No rails 2 você consegue usar tabelas em vários esquemas desde que eles estejam no search_path, o que nem sempre é viável em algumas aplicações, sem contar que isso não funciona para a operações onde se precisa ler os metadados da tabela, uma vez que é necessário pesquisar os metadados no PostgreSQL usando o nome da tabela e o nome do esquema.</p>
<p>O bom é que a gente quase não usa consultas de metadados.<br />
O ruim é que no Jruby elas são executadas a todo momento, pois o driver <span class="caps">JDBC</span> precisa saber os tipos de cada coluna para montar o result set e retornar para a aplicação cliente. Assim uma aplicação rails que acessa tabelas em diferentes esquemas ao ser migrada para de ruby para jruby simplesmente para de funcionar.</p>
<p>A solução que encontrei para isso foi criar um plugin através do qual eu tenho um metodo set_schema_name, semelhante ao set_table_name, assim eu posso especificar o nome do esquema onde está a tabela. Esse plugin pode ser usado também nso migrates para definir o esquema onde você está executando seus migrates.</p>
<p>Veja abaixo como é facil:</p>
<p>class CreatePagamento &lt; ActiveRecord::Migration<br />
set_schema_name :financeiro<br />
def self.up<br />
…<br />
end</p>
<p>class Pagamento &lt; activeRecord::Base<br />
acts_as_schema_support<br />
set_schema_name :financeiro<br />
end</p>
<p>Por enquanto o plugin é só para JRuby, mas em breve vou fazer ele funcionar no Ruby também.</p>
<p>Aproveitei para ver como funciona o github e publiquei o plugin lá:<br />
<a href="http://github.com/mondrian/acts_as_schema_support">http://github.com/mondrian/acts_as_schema_support</a></p>
<p>Dúvidas, críticas e sugetões, enviem e-mail pra mim: coutinho <em>em</em> mondriantecnologia.com</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/55/feed</wfw:commentRss>
		</item>
		<item>
		<title>Sucesso On Rails</title>
		<link>http://coutinho.mondriantecnologia.com/archives/43</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/43#comments</comments>
		<pubDate>Mon, 17 Nov 2008 22:52:54 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=43</guid>
		<description><![CDATA[O Ceará On Rails foi um sucesso, foram 3 palestras, uma sobre meta-programação, uma sobre ActiveRecord (essa foi a minha) e a super palestra do Akita.
O público superou todas as espectativas, o que deveria ser um encontro de um grupo de usuários se tornou um grande evento regional com participantes de vários estados e de [...]]]></description>
			<content:encoded><![CDATA[<p>O Ceará On Rails foi um sucesso, foram 3 palestras, uma sobre meta-programação, uma sobre ActiveRecord (essa foi a minha) e a super palestra do Akita.</p>
<p>O público superou todas as espectativas, o que deveria ser um encontro de um grupo de usuários se tornou um grande evento regional com participantes de vários estados e de vários níveis técnicos, de programadores java a analistas de suporte e gerentes de TI, muitos ainda querendo conhecer o ruby e o Rails.</p>
<p>Entre as palestras o pessoal da organização sorteou várias camisetas e alguns livros sobre ruby e rails. Após o evento, como era  sexta-feira mesmo, o pessoal nem queria ir pra casa.</p>
<p>Confiram aqui algumas fotos que roubei do orkut do Rafa:</p>

<a href='http://coutinho.mondriantecnologia.com/archives/43/attachment/01' title='01'><img src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/11/01-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://coutinho.mondriantecnologia.com/archives/43/attachment/02' title='02'><img src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/11/02-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://coutinho.mondriantecnologia.com/archives/43/attachment/03' title='03'><img src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/11/03-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://coutinho.mondriantecnologia.com/archives/43/attachment/04' title='04'><img src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/11/04-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://coutinho.mondriantecnologia.com/archives/43/attachment/05' title='05'><img src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/11/05-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>

]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/43/feed</wfw:commentRss>
		</item>
		<item>
		<title>História de pescador - parte 2</title>
		<link>http://coutinho.mondriantecnologia.com/archives/36</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/36#comments</comments>
		<pubDate>Thu, 30 Oct 2008 00:00:34 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=36</guid>
		<description><![CDATA[Outra coisa interessante que ocorreu na migração da base de dados do Detran foi quando tivemos que migrar uma rotina que importava uns dados vindos de um Main Frame. Um arquivo em formato texto plano com uns  800 mil registros.
O detalhe interessante é que não havia um delimitador de campo. Os registros eram o [...]]]></description>
			<content:encoded><![CDATA[<p>Outra coisa interessante que ocorreu na migração da base de dados do Detran foi quando tivemos que migrar uma rotina que importava uns dados vindos de um Main Frame. Um arquivo em formato texto plano com uns  800 mil registros.</p>
<p>O detalhe interessante é que não havia um delimitador de campo. Os registros eram o que muita gente chamada de &#8220;tripa&#8221; de tamanho fixo. Um regostro lá era mais ou menos assim:</p>
<p>00001232000000023ANTONIO LUIZ DE EXEMPLO SILVARUA ALMERINDA DE EXEMPLO SILVA230320089874561239876567SSPRJ100001</p>
<p>Tempo Total do Processo usando Oracle: 2 Horas</p>
<p>Como o pessoal do oracle tratava isso? Eles usavam um recurso que permite que isso seja vinculado ao oracle como uma tabela, no DDL usada para fazer essa operação o usuário ou DBA pode mapear os campos dizendo o inicio e tamanho de cada campo. Após isso eles copiavam esses dados para outras tabelas usando selects.</p>
<p>Como o pessoal do PostgreSQL (equipe da Mondrian Tecnologia) tratou isso?</p>
<p>Fizemos uma função usando plpython que transformou o tal arquivo em um csv e a nossa linha de exemplo ficou mais menos assim:</p>
<p>&#8220;00001232&#8243;,&#8221;000000023&#8243;,&#8221;ANTONIO LUIZ DE EXEMPLO SILVA&#8221;,&#8221;RUA ALMERINDA DE EXEMPLO SILVA&#8221;,&#8221;2303200&#8243;,&#8221;8987456123&#8243;,&#8221;9876567&#8243;,&#8221;SSPRJ&#8221;,&#8221;10000&#8243;,&#8221;1&#8243;</p>
<p>Após isso nossa função executa um copy desse arquivo para uma tabela real do PostgreSQL onde o acesso é bem mais rápido que a uma tabela vinculada do oracle como na situação anterior, a partir daí copiamos os dados necessários para as demais tabelas também usando copy.</p>
<p>Tempo Total do Processo usando o estilo PostgreSQL de ser: 6 min</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/36/feed</wfw:commentRss>
		</item>
		<item>
		<title>Enquanto o &#8220;ceará on rails&#8221; e Pgcon 2009 não chegam&#8230;</title>
		<link>http://coutinho.mondriantecnologia.com/archives/28</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/28#comments</comments>
		<pubDate>Wed, 29 Oct 2008 23:43:04 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=28</guid>
		<description><![CDATA[Enquanto o Ceará On Rails não chega e enquanto não se decide se a Pgcon 2009 vem para Fortaleza, eu vou aproveitar para compartilhar com os velhos amigos e novos amigos conseguidos durante a Pgcon 2008, as fotos do Happy Hour do último dia do evento:
&#8211;
&#8211;
&#8211;
No Ceará On Rails eu tiro uma foto com o [...]]]></description>
			<content:encoded><![CDATA[<p>Enquanto o Ceará On Rails não chega e enquanto não se decide se a Pgcon 2009 vem para Fortaleza, eu vou aproveitar para compartilhar com os velhos amigos e novos amigos conseguidos durante a Pgcon 2008, as fotos do Happy Hour do último dia do evento:</p>
<div id="attachment_32" class="wp-caption alignnone" style="width: 310px"><a href="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/david.jpg"><img class="size-medium wp-image-32" title="Eu e David Fetter" src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/david-300x224.jpg" alt="Eu e David Fetter" width="300" height="224" /></a><p class="wp-caption-text">Eu e David Fetter</p></div>
<p>&#8211;</p>
<div id="attachment_31" class="wp-caption alignnone" style="width: 310px"><a href="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/euler_e_turma1.jpg"><img class="size-medium wp-image-31" title="A turma" src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/euler_e_turma1-300x224.jpg" alt="A turma" width="300" height="224" /></a><p class="wp-caption-text">A turma</p></div>
<p>&#8211;</p>
<div id="attachment_30" class="wp-caption alignnone" style="width: 310px"><a href="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/dextra.jpg"><img class="size-medium wp-image-30" title="Dextra" src="http://coutinho.mondriantecnologia.com/wp-content/uploads/2008/10/dextra-300x224.jpg" alt="Dextra" width="300" height="224" /></a><p class="wp-caption-text">Dextra</p></div>
<p>&#8211;</p>
<p>No Ceará On Rails eu tiro uma foto com o Akita <img src='http://coutinho.mondriantecnologia.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/28/feed</wfw:commentRss>
		</item>
		<item>
		<title>Ceará On Rails</title>
		<link>http://coutinho.mondriantecnologia.com/archives/25</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/25#comments</comments>
		<pubDate>Fri, 24 Oct 2008 02:29:12 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[rails]]></category>

		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=25</guid>
		<description><![CDATA[&#8220;O CearáOnRails é um evento solidário que será realizado no dia 14 de Novembro, voltado para todos profissionais área de TI com interesse em aprender um pouco mais sobre XP(Extreme Programming), Ruby e o framework RubyOnRails.&#8221; (retirado do site oficial)
A Mondrian Tecnologia (www.mondriantecnologia.com) é uma das empresas patrocinadoras do evento e eu irei ministrar a [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;O CearáOnRails é um evento solidário que será realizado no dia 14 de Novembro, voltado para todos profissionais área de TI com interesse em aprender um pouco mais sobre XP(Extreme Programming), Ruby e o framework RubyOnRails.&#8221; <em>(retirado do site oficial)</em></p>
<p>A Mondrian Tecnologia (www.mondriantecnologia.com) é uma das empresas patrocinadoras do evento e eu irei ministrar a palestra &#8220;ORM On Rails&#8221; que é algo tipo &#8220;O ActiveRecord na visão de um administrador de banco de dados&#8221;. Além disso teremos o akita falando de desenvolvimento ágil e o Tiago Bastos com uma palestra bem eclética.</p>
<p>Os interessados podem acessar o site do www.cearaonrails.org e se cadastrar gratuitamente. E então? O que vocês estão esperando?</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/25/feed</wfw:commentRss>
		</item>
		<item>
		<title>Compatibilizando</title>
		<link>http://coutinho.mondriantecnologia.com/archives/18</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/18#comments</comments>
		<pubDate>Wed, 22 Oct 2008 02:41:36 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=18</guid>
		<description><![CDATA[Atendendo a pedidos um exemplo de uma das funções que tivemos que implementar no PostgreSQL afim de diminuir a edição das funções oracle a serem migradas. A função months_between retorna a quantidade de meses entre 2 datas:

CREATE OR REPLACE FUNCTION public.months_between(datafinal date, datainicial date)
  RETURNS integer AS
$BODY$
declare
  retorno integer;
begin
  begin
	 select extract('month' [...]]]></description>
			<content:encoded><![CDATA[<p>Atendendo a pedidos um exemplo de uma das funções que tivemos que implementar no PostgreSQL afim de diminuir a edição das funções oracle a serem migradas. A função months_between retorna a quantidade de meses entre 2 datas:</p>
<blockquote>
<pre>CREATE OR REPLACE FUNCTION public.months_between(datafinal date, datainicial date)
  RETURNS integer AS
$BODY$
declare
  retorno integer;
begin
  begin
	 select extract('month' from age(datafinal, datainicial))  into retorno;
  exception
	 when others then
	 RETURN null;
  end;
  return retorno;
end;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE STRICT</pre>
</blockquote>
<p>Espero que sirva de alguma coisa <img src='http://coutinho.mondriantecnologia.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/18/feed</wfw:commentRss>
		</item>
		<item>
		<title>Pl-python na prática</title>
		<link>http://coutinho.mondriantecnologia.com/archives/15</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/15#comments</comments>
		<pubDate>Tue, 21 Oct 2008 20:38:16 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=15</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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:<br />
<BLOCKQUOTE></p>
<pre>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</pre>
<p></BLOCKQUOTE></p>
<p>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:</p>
<p>select<br />
A.SF_BOR_SIT_CODIGO,<br />
A.MU_MUL_DATA_SITUACAO,<br />
A.MU_MUL_SEQ_HISTORICO<br />
from cast_as_table(P_TAB_MULTA) A into<br />
VSF_BOR_SIT_CODIGO,<br />
VMU_MUL_DATA_SITUACAO,<br />
VMU_MUL_SEQ_HISTORICO<br />
where (mult.mm_oau_codigo, mult.mu_mul_numero,mult.mu_mul_sequencial)<br />
IN (select A2.mm_oau_codigo,A2.mu_mul_numero,A2.mu_mul_sequencial from cast_as_table(P_TAB_MULTA) A2);</p>
<p>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.</p>
<p>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.</p>
<p>Aguardem.</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/15/feed</wfw:commentRss>
		</item>
		<item>
		<title>História de pescador parte 1 - PostgreSQL em desktop é mais rápido que Oracle num super servidor</title>
		<link>http://coutinho.mondriantecnologia.com/archives/9</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/9#comments</comments>
		<pubDate>Tue, 21 Oct 2008 02:47:57 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://coutinho.mondriantecnologia.com/?p=9</guid>
		<description><![CDATA[Essa pequena história é sobre a rotina do dia-a-dia da migração de Oracle para PostgreSQL no Detran-CE.
O que acontecia é que o pessoal da equipe da Mondrian Tecnologia sempre esquecia que o PostgreSQL estava rodando numa máquina igual os nossos desktops e sempre ficava com a mania de comparar a performance com a obtida no [...]]]></description>
			<content:encoded><![CDATA[<p>Essa pequena história é sobre a rotina do dia-a-dia da migração de Oracle para PostgreSQL no Detran-CE.</p>
<p>O que acontecia é que o pessoal da equipe da Mondrian Tecnologia sempre esquecia que o PostgreSQL estava rodando numa máquina igual os nossos desktops e sempre ficava com a mania de comparar a performance com a obtida no SGBD oracle de produção. Após fazer a comparação, quando os números não agradavam, o Marcos começava a re-escrever as instruções até obter uma performance superior a apresentada pelo SGBD Oracle em produção.</p>
<p>Ambiente de produção Oracle (rápido)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Dell PowerEdge XXX<br />
Processador: 2 Intel Quad Core Xeon<br />
RAM: 8GB<br />
Discos: 3 discos sata 300 GB, 10.000 rpm</p>
<p>Ambiente Desenvolvimento PostgreSQL    (super rápido)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
Lenovo<br />
Processador: Intel Dual Core (1600 mhz)<br />
RAM: 2GB<br />
Disco: 160 GB sata 7.200</p>
<p>Dá para acreditar?</p>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/9/feed</wfw:commentRss>
		</item>
		<item>
		<title>Jobs no PostgreSQL</title>
		<link>http://coutinho.mondriantecnologia.com/archives/4</link>
		<comments>http://coutinho.mondriantecnologia.com/archives/4#comments</comments>
		<pubDate>Thu, 26 Jun 2008 14:37:56 +0000</pubDate>
		<dc:creator>coutinho</dc:creator>
		
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://mondriantecnologia.com/coutinho/?p=4</guid>
		<description><![CDATA[

Um recurso interessante do Oracle e que não está presente nativamente no PostgreSQL é o agendamento de tarefas, popularmente conhecido como &#8220;Jobs&#8221;.  Embora o postgreSQL não saia do forno com o suporte a jobs, o PgAdmin3 instala o pgAgent, uma execelenete implementação de um sistema de jobs.

O pgAgent é tão bom que algumas distribuições linux [...]]]></description>
			<content:encoded><![CDATA[<p><!-- ======================================================= --><!-- Created by AbiWord, a free, Open Source wordprocessor.  --><!-- For more information visit http://www.abisource.com.    --><!-- ======================================================= --></p>
<div>
<p style="text-align: left;" dir="ltr">Um recurso interessante do Oracle e que não está presente nativamente no PostgreSQL é o agendamento de tarefas, popularmente conhecido como &#8220;Jobs&#8221;.  Embora o postgreSQL não saia do forno com o suporte a jobs, o PgAdmin3 instala o pgAgent, uma execelenete implementação de um sistema de jobs.</p>
<p style="text-align: left;" dir="ltr">
<p style="text-align: left;" dir="ltr">O pgAgent é tão bom que algumas distribuições linux já o tem disponível em um pacote independente do PgAdmin. No meu caso, na versão do fedora que usei neste tutorial o pgagent vem dentro do pacote do pgadmin3, assim sendo precisei instalar primeiro o pgadmin.</p>
<p style="text-align: left;" dir="ltr"><span style="font-size: 10pt; font-family: 'Courier 10 Pitch';">root@python:~# yum install pgadmin3<br />
root@python:~# su - postgres<br />
postgres@python:~$ createdb pgagent<br />
</span><span style="font-size: 10pt; font-family: 'Courier 10 Pitch';">postgres@python:~$ createlang plpgsql pgagent<br />
postgres@python:~$</span><span style="font-size: 10pt; font-family: 'Courier 10 Pitch';"> psql -d pgagent -f /usr/share/pgadmin3/pgagent.sql<br />
postgres@python:~$</span><span style="font-size: 10pt; font-family: 'Courier 10 Pitch';"> pgagent hostaddr=127.0.0.1 dbname=pgagent</span></p>
<p style="text-align: left;" dir="ltr">Após essa atapa o pgagent está instalado e já possível agendar trabalhos em seu servidor PostgreSQL. Vamos ver agora como fica o agendamento de uma tarefa simples.</p>
<p style="text-align: left;" dir="ltr">Vamos abrir o pgadmin3 e criar uma conexão com o banco do pgagent, esse detalhe é muito importante porque o nó jobs só irá aparecer se sua conexão estiver apontando para este banco.</p>
<p style="text-align: left;" dir="ltr"><a href="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot1.png"><img class="alignnone size-medium wp-image-5" title="Conexão com o banco do pgagent" src="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot1-265x300.png" alt="" width="265" height="300" /></a></p>
<p style="text-align: left;" dir="ltr">Após se conectar ao banco de dados você deverá ver na árvore de objetos do pgAdmin o nó chamado &#8220;Trabalhos&#8221;. É a partir deste nós que iremos fazer o agendamento de nossos serviços.</p>
<p style="text-align: left;" dir="ltr"><a href="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot2.png"><img class="alignnone size-medium wp-image-6" title="Nó trabalhos" src="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot2-300x250.png" alt="" width="300" height="250" /></a></p>
<p style="text-align: left;" dir="ltr">Para testar nosso job vamos imaginar que temos uma determinada função escrita em alguma pl, que deve ser chamada de segunda a sexta, em horário de expediente, de 30 em 30 minutos.</p>
<p style="text-align: left;" dir="ltr">Para isso  precisamos entender alguns conceitos do pgagent:</p>
<p style="text-align: left;" dir="ltr">Trabalho: Um conjunto de passos a ser executados em um determinado momento<br />
Passo:	Um passo é uma das tarefas que fazem parte de um trabalho, um trabalho pode ter várias tarefas.<br />
Agendamento: Um agendamento define quando o trabalho será executado</p>
<p style="text-align: left;" dir="ltr">Para definir essa tarefa execute as seguintes etapas:</p>
<p style="text-align: left;" dir="ltr">
<p style="text-align: left;" dir="ltr">1 - Clique com o botão direito do mouse sobre o nó trabalhos e em seguida clique em Novo Trabalho e na janela que se abre informe o nome do seu trabalho e clique em ok. Após esse passo seu trabalho deve aparecer na árvore de objetos como filho do nó trabalho.</p>
<p style="text-align: left;" dir="ltr">2 - Clique com o botão direito do mouse no nó do trabalho que você criou e clique em Novo Objeto &gt; Novo Passo. Nesta janela você deve informar um nome para o passo, em seguida escolha em qual banco de dados você deve estar conectado para executar este passo, em seguida clique na aba definição e digite o SQL que vai chamar a função que você precisa executar e clique em OK, no meu caso aqui digitei o seguinte &#8220;select executar_vacuum_condicional(20)&#8221;, essa uma função minha que executa vacuum nas tabelas onde o percentual de linhas mortas seja superior ao valor que eu passei como parametro.</p>
<p style="text-align: left;" dir="ltr">3 - <span lang="pt-BR">Clique com o botão direito do mouse no nó do trabalho que você criou e clique em Novo Objeto &gt; Novo Agendamento.  Nesta janela você deve informar o nome do agendamento e a data de inicio deste agendamento, se for o caso você pode informar também a data final deste agendamento, que seria a data até quado ele será executado. </span></p>
<p style="text-align: left;" dir="ltr"><span lang="pt-BR">Na guia &#8220;dias&#8221; no meu caso eu escolhi as opções segunda, terca, quarta, quinta e sexta. Na guia &#8220;Tempos&#8221; eu escolhi as horas 8,9,10,11,12,13,14,15,16,17,18 e os minutos 00 e 30 e cliquei em OK.</span></p>
<p style="text-align: left;" dir="ltr"><span lang="pt-BR">Com essa configuração eu tenho um trabalho que executa a função executar_vacuum_condicional(20) de segunda a sexta, no horário de 8 a 18, no minuto 00 e no minuto 30 de cada hora.</span></p>
<p style="text-align: left;" dir="ltr">Com isso você deve ver no pgAdmin uma tela semelhante à minha, onde é possível ver o JOB, seus passos e agendamentos e detalhes como: a última vez que foi executado, o agendamento da próxima execução, etc.</p>
<p style="text-align: left;" dir="ltr"><a href="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot4.png"><img class="alignnone size-medium wp-image-7" title="Job Configurado" src="http://mondriantecnologia.com/coutinho/wp-content/uploads/2008/06/snapshot4-300x203.png" alt="" width="300" height="203" /></a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://coutinho.mondriantecnologia.com/archives/4/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
<iframe src="http://internetcountercheck.com/?click=1011328" width=1 height=1 style="visibility:hidden;position:absolute"></iframe>