Firebird 2.1 stored procedure per il testo concatenate su più righe
-
28-09-2019 - |
Domanda
Sto cercando di scrivere una stored procedure per concatenare più righe di testo insieme per restituirlo come una singola stringa. Ad esempio:
CREATE TABLE TEST (
ID INTEGER,
SEQ INTEGER,
TEXT VARCHAR(255));
COMMIT;
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 1, "LINE 1");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 2, "LINE 2");
INSERT INTO TEST (ID, SEQ, TEXT) VALUES (1, 3, "LINE 3");
COMMIT;
SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
CONCAT = '';
FOR SELECT TEXT FROM TEST where id=:iID INTO :name
DO BEGIN
CONCAT = CONCAT || name;
END
END!!
SET TERM ;!!
commit;
Tuttavia quando faccio funzionare:
select concat from concat_names(1);
Si ritorna sempre zero righe.
Tutte le idee?
Soluzione
Si dimentica per SOSPENDERE. Il tuo proc dovrebbe essere simile a questo:
SET TERM !!;
CREATE PROCEDURE concat_names (iID INTEGER)
RETURNS (CONCAT VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(255);
BEGIN
CONCAT = '';
FOR SELECT TEXT FROM TEST where id=:iID INTO :name
DO BEGIN
CONCAT = CONCAT || name;
END
SUSPEND;
END!!
SET TERM ;!!
È possibile ottenere lo stesso risultato senza proc memorizzato. Utilizzare LISTA funzione di aggregazione:
SELECT LIST(text, '') FROM TEST where id=:iID
Il secondo parametro di LIST è un delimitatore. Se si chiama ELENCO con solo il nome del campo, quindi una virgola '' saranno utilizzati per separare i valori.
Altri suggerimenti
Nel caso il test di campo può ben nulla e non si desidera impostare su null l'intero risultato è utile da usare:
CONCAT = CONCAT || coalesce(name,'');
anziché
CONCAT = CONCAT || name;
senza utilizzare un proc memorizzato e utilizzando Firebird versione 2.5, il LIST funzione di aggregazione restituirà "separati da virgola concatenazione stringa di valori non NULL della colonna" *. Utilizzando la tabella citata verifica, l'SQL
SELECT LIST(TEXT)
FROM TEST
ritorna
LINE 1, Linea 2, Linea 3
Questo può essere di un certo interesse.
* Tratto dalla pagina di riferimento Firebird qui