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.

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top