



Olá pessoal.
Em alguns casos temos nos bancos de dados campos do tipo BLOB para armazenar textos.
Há ocasiões que é importante recuperar linha a linha deste BLOB que atua como
um StringList ou Memo.
Legal, mas como fazer?
Para ajudar, criamos um procedimento que converte um BLOB de texto puro (multi linhas)
em linhas individuais.
Vamos ao código!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | CREATE OR ALTER PROCEDURE UTIL_SPLIT_BLOB_TO_ROW ( BLOBTEXT VARCHAR(1000)) RETURNS ( MNUMBER INTEGER, RETSTRING VARCHAR(1000)) AS DECLARE variable LSTRING VARCHAR(1000); DECLARE variable POS1 INTEGER; DECLARE variable POS2 INTEGER; DECLARE variable INTLEN INTEGER; BEGIN lstring = SUBSTRING( BLOBTEXT FROM 1 FOR 1000); pos1 = 1; intlen = CHAR_LENGTH(lstring); MNUMBER = 0; while (pos1 < intlen) do BEGIN MNUMBER = MNUMBER + 1; pos2 = POSITION (ASCII_CHAR(13) IN SUBSTRING(lstring FROM pos1)); IF (pos2 = 0) THEN BEGIN pos2 = intlen; END retstring = SUBSTRING (lstring FROM pos1 FOR (pos2 - 1)); pos1 = pos2 + pos1; suspend; END END |
No procedimento estamos usando varchar(1000) de paramêtros, mas isso pode ser adaptado a sua realidade.
Agora vamos ao exemplo de uso:
1 2 3 4 | SELECT U.MNUMBER, U.RETSTRING FROM UTIL_SPLIT_BLOB_TO_ROW(:texto) U |
Ao informar no parâmetro como exemplo:
SHOW DELPHI
MELHOR COMUNIDADE DE DELPHI DO BRASIL
o retorno será
MNUMBER RETSTRING
1 SHOW DELPHI
2 MELHOR COMUNIDADE DE DELPHI DO BRASIL
Conclusão, com um simples procedimento é possível transformar um campo texto de várias linhas
em linhas de retorno de um SQL.
Espero que seja útil a todos! Um abraço e até o próximo post.
Dúvidas ou sugestões? Deixe o seu comentário!
Fonte de referência: https://www.experts-exchange.com/questions/23958854/How-to-split-blob-field-into-rows.html