Firebird gespeicherte Prozedur für verketten alle Feldwerte aus mehreren Zeilen
-
06-07-2019 - |
Frage
mein Ziel ist es, eine gespeicherte Prozedur zu schreiben, die alle Feldwerte aus mehreren Zeilen in einer einzigen Ausgangsgröße sammeln kann (vielleicht varchar (some_length)). Es mag seltsam erscheinen Lösung, aber ich habe recht positiv sein die einzige, die ich in in dieser Situation im verwenden können. Ich habe nicht Firebird verwendet vor und gespeicherte Prozeduren aussehen Art und Weise anders als in anderen bekannten db-Systemen. My Firebird ist 1.5 und Dialekt 3 (nicht sicher, was es bedeutet). Also vielleicht jemand mir mit einem Algorithmus Beispiel helfen könnte.
Lösung
Das folgende Verfahren tut, was Sie beschreiben:
SET TERM !!;
CREATE PROCEDURE concat_names
RETURNS (concat VARCHAR(2000))
AS
DECLARE VARIABLE name VARCHAR(100);
BEGIN
concat = '';
FOR SELECT first_name || ' ' || last_name FROM employee INTO :name
DO BEGIN
concat = concat || name || ', ';
END
END!!
SET TERM ;!!
EXECUTE PROCEDURE concat_names;
Aber ich frage die Weisheit dieser Lösung. Wie wissen Sie, die VARCHAR lang genug ist für alle Zeilen in der gewünschten Daten-Set?
Es ist viel einfacher und sicherer, eine Abfrage auszuführen, um das Ergebnis zu einer Anwendung Zeile für Zeile zurückzukehren. Jede Anwendung Programmiersprache hat Methoden Strings verketten, aber noch wichtiger ist sie flexiblere Methoden um das Wachstum von Daten zu verwalten.
By the way, „Dialekt“ in Firebird und Interbase bezieht sich auf einen Kompatibilitätsmodus, die eingeführt wurde, so dass Anwendungen für die Interbase 5.x entwickelt wird, können mit späteren Versionen von Interbase und Firebird arbeiten. Das war vor fast zehn Jahren, und AFAIK gibt keine Notwendigkeit, heute ist alles zu verwenden, niedriger als Dialekt 3.
Andere Tipps
Sie haben für Nullwerte zu testen, wenn verketten, hier ist ein Beispiel für zwei Felder und ein Separator zwischen ihnen:
CREATE PROCEDURE CONCAT(
F1 VARCHAR(385),
F2 VARCHAR(385),
SEPARATOR VARCHAR(10))
RETURNS (
RESULT VARCHAR(780))
AS
begin
if ((:f1 is not null) and (:f1 <> '')) then
result = :f1;
if ((:f2 is not null) and (:f2 <> '')) then
if ((result is not null) and (result <> '')) then
begin
if ((:separator is not null) and (separator <> '')) then
result = result||separator||f2;
else
result = result||f2;
end
else
result = f2;
suspend;
end
Rückkehr mehr Zeilen mit Firebird gespeicherten Prozeduren ist sehr, sehr einfach.
Sie nicht verwenden:
execute procedure proc_name(value);
Stattdessen verwenden die:
select * from proc_name(value);