Como transformar um campo blob em linhas de string (varchar) no SQL Firebird?
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 |
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 |
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
-
Giovani Da Cruz
-
6.528 views
- 0 comentários
- 25 de julho de 2019
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo