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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top