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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top