Firebird 2.1 Verfahren zu verketten Text auf mehrere Zeilen gespeichert
-
28-09-2019 - |
Frage
Ich versuche, eine gespeicherte Prozedur zu schreiben mehrere Textzeilen verketten zusammen als eine einzelne Zeichenfolge zurück. Zum Beispiel:
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;
Allerdings, wenn ich laufe:
select concat from concat_names(1);
Es gibt immer null Zeilen.
Irgendwelche Ideen?
Lösung
Sie vergessen für suspendieren. Ihre proc sollte wie folgt aussehen:
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 ;!!
Sie können ohne gespeicherte Prozedur um das gleiche Ergebnis erzielen. Verwenden LIST Aggregatfunktion:
SELECT LIST(text, '') FROM TEST where id=:iID
Die zweite Parameter von LIST ist ein Trennzeichen. Wenn Sie LISTE mit nur Feldnamen nennen, dann Komma ‚‘ verwendet wird, um separate Werte.
Andere Tipps
Im Fall das Feld TEST kann ben null und Sie nicht festlegen möchten das gesamte Ergebnis auf null ist es sinnvoll zu nutzen:
CONCAT = CONCAT || coalesce(name,'');
statt
CONCAT = CONCAT || name;
Ohne eine gespeicherte Proc verwendet und mit der Version Firebird 2.5, die LIST Aggregationsfunktion zurückkehren „kommagetrennte Zeichenfolge Verkettung von Nicht-NULL-Werten in der Spalte“ *. Unter Verwendung der oben genannten Tabelle TEST, die SQL
SELECT LIST(TEXT)
FROM TEST
Rückkehr
LINE 1, LINE 2, LINE 3
Das von Interesse sein kann.
* Genommen von der Firebird Referenzseite hier