Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> tablice w procedurach, czy jest coś takiego
jml
post 12.12.2007, 16:52:17
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 8.02.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nevt
post 12.12.2007, 16:58:02
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


w tym celu zakładasz tablice tymczasowe...


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
jml
post 12.12.2007, 19:32:03
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 8.02.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nevt
post 13.12.2007, 07:51:19
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
jml
post 13.12.2007, 13:57:16
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 8.02.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 15:41