2008-10-08 5 views
5

moim celem jest napisanie przechowywanego procesu, który może zebrać wszystkie wartości pól z wielu wierszy do jednej zmiennej wyjściowej (może varchar (some_length)). To może wydawać się dziwne rozwiązanie, ale mam dość pozytywny jego jedyny, którego mogę używać w tej sytuacji. Nie używałem Firebird wcześniej, a przechowywane proci wyglądają inaczej niż w innych znanych systemach db. Mój Firebird ma 1,5 i dialekt 3 (nie wiem, co to znaczy). Więc może ktoś mógłby mi pomóc z przykładem algorytmu.Zapamiętana procedura Firebirda do łączenia wszystkich wartości pól z wielu wierszy

Odpowiedz

5

Poniższa procedura robi to, co można opisać:

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; 

Ale kwestionować sensowność tego rozwiązania. Skąd wiadomo, że VARCHAR jest wystarczająco długi dla wszystkich wierszy w pożądanym zestawie danych?

O wiele łatwiej i bezpieczniej jest uruchomić zapytanie, aby zwrócić wynik do wiersza aplikacji po wierszu. Każdy język programowania aplikacji ma metody łączenia łańcuchów, ale co ważniejsze, mają bardziej elastyczne metody zarządzania wzrostem danych.

Nawiasem mówiąc, "dialekt" w Firebird i InterBase odnosi się do trybu zgodności, który został wprowadzony, aby aplikacje opracowane dla InterBase 5.x mogły pracować z późniejszymi wersjami InterBase i Firebird. To było prawie dziesięć lat temu, a AFAIK nie trzeba już używać niczego niższe niż dialekcie 3.

+0

W przypadku korzystania z Firebird 2.1, można użyć funkcji Zbiorczy wykaz z udostępnia tekstowy BLOB wyniku. To znaczy. brak limitu pola varchar. –

+1

Jeśli sobie przypomnę, nie można zadeklarować parametru procedury lub wartości zwracanej z typem danych BLOB lub ARRAY. –

+1

Każda wartość pusta złamie to rozwiązanie. – Nelson

0

Trzeba przetestować dla wartości null, gdy łączenie, to jest przykład dla dwóch pól oraz separator między nimi:

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 
0

Powracanie wielu wierszy za pomocą przechowywanych procedur Firebird jest bardzo proste.

nie wolno używać:

execute procedure proc_name(value); 

Zamiast używać:

select * from proc_name(value); 
Powiązane problemy