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
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.
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
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);
- 1. Uzyskiwanie wartości wielu wierszy z tabeli MySQL
- 2. Firebirda, jak wybrać identyfikatory pasujące do wszystkich elementów w zestawie
- 3. Otrzymaj wartości wszystkich pól wyboru w repeateru
- 4. Get nazwy pól z procedura składowana z Dapper
- 5. Jak wyjść z łączenia wielu do wielu tabel w mysql?
- 6. Django - pobierz obiekty z wielu do wielu pól
- 7. Narzędzia do łączenia wielu plików xsd
- 8. Uzyskiwanie różnych wierszy od lewego zewnętrznego łączenia
- 9. Wielokrotne instrukcje Firebirda
- 10. Jak znaleźć duplikaty wierszy na podstawie wielu pól w MySQL?
- 11. SQL - Wstawianie wartości wielu wierszy do pojedynczej kolumny
- 12. Spark: bardziej wydajna agregacja do łączenia ciągów z różnych wierszy
- 13. Wklejanie wielu wierszy do TEdit
- 14. MYSQL - WYBIERZ z wielu wierszy, ten sam użytkownik, różne wartości
- 15. Wartości sum z wielu wierszy w jednym wierszu
- 16. CakePHP nie otrzymuje wszystkich pól z DB?
- 17. Przypisywanie wartości dla wielu pól wprowadzania przy użyciu javascript?
- 18. Limit wstawiania wielu wierszy
- 19. ZF2 wstawianie wielu wierszy
- 20. Otrzymywanie wszystkich utworzonych dzisiaj wierszy
- 21. MySql - Wstawianie wielu wierszy z połączonym podzapytaniem?
- 22. Zapytanie MYSQL do przeszukiwania WSZYSTKICH pól?
- 23. ŁĄCZENIA vs WYBÓR z wielu tabel
- 24. Otrzymuj dane POST z wielu pól wyboru?
- 25. Django: Order_by wielu pól
- 26. Implementacja samodzielnego modelu (jedno-do-wielu pól)
- 27. Prześlij bazę danych Firebirda do innej sieci
- 28. Jak grupować wyniki łączenia wewnętrznego mysql z wierszy w kolumny
- 29. Jak poprawnie indeksować tabelę łączenia dla wielu do wielu w MySQL?
- 30. Django reszta ramy serializowanie wielu do wielu pól
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. –
Jeśli sobie przypomnę, nie można zadeklarować parametru procedury lub wartości zwracanej z typem danych BLOB lub ARRAY. –
Każda wartość pusta złamie to rozwiązanie. – Nelson