Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tablice w procedurach
Forum PHP.pl > Forum > Bazy danych > MySQL
jml
Mam taki problem.

Utworzyłem sobie procedurę, zwracającą 2 zmienne, zawierające sumę pewnych danych z określonych kolumn. Jednak działa mi to dla jednego zapytania select.

Czy da się zrobić coś takiego, żebym:
- w procedurze, przy pomocy petli while leciał przez np 30 rekordów osobno
- sume poszczególnych kolumn z każdej iteracji zapisać do zmiennej tablicowej, którą procedura zwraca

Czy jest to możliwe w MySQL i w ogóle w jakimkolwiek silniku bazy danych? Jeśli nie, czy można jakoś zrobić, żeby procedura po prostu zwróciła tablicę asocjacyjną, żebym mógł zczytać te same dane dla różnych rekordów?
nevt
w tym celu zakładasz tablice tymczasowe...
jml
Dzięki wielkie. W takim razie kolejne pytanie:
Cytat
CREATE PROCEDURE get_rank(IN program_number INT)
BEGIN
DECLARE i INT;
DECLARE comm INT;
DECLARE trans INT;
DECLARE rank_sum INT;
SET i=0;
CREATE TEMPORARY TABLE IF NOT EXISTS program_rank (program_id int unsigned not null primary key, rank int unsigned not null);
WHILE i<program_number DO
SET i = i + 1;
SELECT SUM(type)
INTO comm
FROM comments
WHERE program_id = i
AND confirm_code = '0';
SELECT SUM(amount)
INTO trans
FROM transactions
WHERE program_id = i
and type = 1;
set rank_sum = IF(trans,trans + comm,comm);
INSERT INTO program_rank VALUES (i, rank_sum);
END WHILE;
END;
//
Co tu jest nie tak? Błąd jest w wartości trans. Jeśli jest ona null (brak wpisów w tabeli comments), rank_sum też jest wtedy null, a nie może być. Dałem więc: set rank_sum = IF(trans,trans + comm,comm);
Powinno to w przypadku gdy trans jest NULL, zwracać tylko wartość comm. Jeśli nie, zwracać sumę trans+comm. Jednak jeśli trans jest NULL, rank_sum też jest null. Jeśli jest różne od NULL, wszystko działa jak powinno.

Pomóżcie prosze, już modyfikowałem to na różne sposoby ale nic nie pomogło, ciągle mam ten sam błąd.
nevt
szczerze mówiąc to powinno działać... chyba że comm też jest NULL (jeśli nie ma jeszcze żadnych komentarzy...) hm... ale możesz spróbować tak:
  1. SET rank_sum = IFNULL(trans + comm, IFNULL(comm, 0));

powodzenia.
jml
Dzięki, już sobie poradziłem. Szkoda, że jak nie ma wartości to sum zwraca NULL, a nie 0. Nie można teraz dodać NULLA do żadnej wartości, wychodzi NULL.

Jeśli obie są NULL, to i tak dla mnie nie ma znaczenia, wtedy wynikiem jest NULL, interpretowany przez PHP jako 0. Jeśli natomiast jedna z wartości była NULL, a druga liczbą, otrzymywałem NULL, choć powinno być coś innego.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.