[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