[firebase-br] Procedure Remover Tags HTML - A saga continua...

Carlos H. Cantu listas em warmboot.com.br
Qua Jan 6 17:49:34 -03 2016


Cada vez que vc manipula uma variável do tipo blob no PSQL (triggers,
procedures, etc), mesmo que mude apenas um byte nele, uma nova "cópia"
do blob todo é criada em memória. Acredito que isso não seja muito bom
em termos de performance ou mesmo de memória consumida.

Por curiosidade, faça um teste trocando blob por varchar, e veja como
fica a performance. Obviamente, o conteúdo não poderá exceder o limite
do varchar (32765).

PS: A variável TagFound pode ser tranquilamente um varchar, afinal,
uma tag nunca será maior que o limite dele.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

CeALB> Olá Colegas,

CeALB> Preciso de uma rotina que retire todos os tags html de um campo,
CeALB> revomovendo tudo o que estiver dentro dos <> apenas (Os coódigos de
CeALB> acentuação podem ser ignorados).

CeALB> Seguindo os conselhos do colega Gladiston, poderia tentar uma função
CeALB> externa. Mas, pretendo rodar o banco em diversas plataformas
CeALB> (Mac/Win/Linux) o que dificulta o processo, pois precisaria compilar a
CeALB> tunção em diferentes plataformas...

CeALB> Decidi, então, fazer via Stored Procedure. Ficou assim:



CeALB> CREATE OR ALTER PROCEDURE STRIPALLHTML (
CeALB>     htmlstring blob sub_type 1 segment size 80)
CeALB> returns (
CeALB>     stripedstring blob sub_type 1 segment size 80)
CeALB> as
CeALB> declare variable tagbegin integer;
CeALB> declare variable tagend integer;
CeALB> declare variable tagfound blob sub_type 1 segment size 80 collate unicode_ci_ai;
CeALB> begin
CeALB>   TagBegin = position ('<', HTMLString);

CeALB>   while (:TagBegin > 0) do
CeALB>   begin
CeALB>     TagEnd = position ('>', HTMLString, TagBegin);
CeALB>     TagFound = substring (HTMLString FROM TagBegin FOR ((TagEnd -
CeALB> TagBegin) + 1));
CeALB>     HTMLString = replace (HTMLString, TagFound, '');
CeALB>     TagBegin = position ('<', HTMLString);
CeALB>   end
CeALB>   StripedString = HTMLString;
CeALB>   suspend;
CeALB> end

CeALB> Para chamá-la eu uso o seguinte comando:

CeALB> select items.note, (SELECT stripedString FROM StripAllHTML
CeALB> (items.note)) from items

CeALB> A procedure retorna exatamente o resultado que eu preciso. O problema
CeALB> é que está LENTA DEMAIS. Rodando em um banco com 400 itens o IBExpert
CeALB> demora quase 2 minutos para dar o retorno... Em média cada campo NOTE
CeALB> possui 2.000 caracteres...

CeALB> Estou fazendo algo errado?
CeALB> Podem dar uma DICA?

CeALB> Abraços,
CeALB> Christian





Mais detalhes sobre a lista de discussão lista