2010-11-25 1 views
3

Ich versuche eine gespeicherte Prozedur zu schreiben, um mehrere Zeilen Text miteinander zu verketten, um sie als eine einzige Zeichenfolge zurückzugeben. Zum Beispiel:Firebird 2.1 gespeicherte Prozedur zum Verketten von Text in mehreren Zeilen

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 laufen:

select concat from concat_names(1); 

Es gibt immer null Zeilen.

Irgendwelche Ideen?

Antwort

7

Sie vergessen für SUSPEND. Ihr Prozess 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 das gleiche Ergebnis ohne gespeicherte Proc erreichen. Verwenden Sie LIST-Aggregatfunktion:

Zweiter Parameter von LIST ist ein Trennzeichen. Wenn Sie LIST nur mit dem Feldnamen aufrufen, wird das Komma ',' zum Trennen der Werte verwendet.

+0

Hallo Andrei, die Bit-Werke SUSPEND aber die Liste nicht, weil Sie die Reihenfolge nicht garantieren können, die Zeilen werden von der Select-Anweisung zurückgegeben werden. Wenn Sie nach der SEQ-Spalte bestellen, müssen Sie danach gruppieren, was dann nicht die korrekten Ergebnisse liefert. Ich hatte bereits versucht, dass es effizienter wäre. Übrigens, sind Sie Andrei K von GBS? – williamsdb

+0

Was ist GBS? :) –

+0

Opps, sorry, falscher Briefauftrag GSB. Golden Software, Belarus – williamsdb

0

Im Fall das Feld TEST kann ben null und Sie wollen es nicht, um das ganze Ergebnis auf null nützlich zu verwenden:

CONCAT = CONCAT || coalesce(name,''); 

statt

CONCAT = CONCAT || name; 
0

Ohne Verwendung Ein Stored Proc und Verwendung der Version Firebird 2.5, die LIST Aggregationsfunktion wird "Komma-getrennte String-Verkettung von Nicht-NULL-Werten in der Spalte" * zurückgeben. Unter Verwendung der zuvor beschriebenen Testtabelle, die SQL

SELECT LIST(TEXT) 
    FROM TEST 

kehrt

LINE 1, Zeile 2, Zeile 3

Dies kann von Interesse sein.

* Genommen von der Firebird Referenzseite here

Verwandte Themen