![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 68 Pomógł: 0 Dołączył: 10.07.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Sprawa dotyczy Oracle'a, ale generalnie chodzi o dzialanie transakcji (wiec kazda baza, ktora je obsluguje powinna miec podobne rozwiazanie). Mam taka sytuacje, ze mam dwie tabele o nastepujacej budowie (pominalem typy danych, restrykcje, zbedne pola itp. - uwzglednilem tylko elementy istotne):
Sprawa wyglada nastepujaco: Musze o pewnej okreslonej godzinie kazdego dnia wpisac do tabeli statystyk informacje o lacznej ilosci zadan z tabeli zadan, ale w ten sposob, ze w pole ilosc_zadan wpisze: - czyli wszystkie zadania jakie zostaly wykonane, a w pole ilosc_wykonanych_zadan wpisze
Jako, ze nie da sie (o ile mi wiadomo) ulozyc tego w jednym warunku (a musi byc to wykonane w tym samym czasie) bo gdy dodam warunek to bedzie on rowniez dotyczyl tej funkcji agregujacej po calosci, wpadlem na pomysl zeby zastosowac transakcje. Oto jak to widze: Kod Poczatek transakcji: insert into TabelaStatystyk(ilosc_zadan) select count(id_zadania) from TabelaZadan; insert into TabelaStatystyk(ilosc_wykonanych_zadan) select count(id_zadania) from TabelaZadan where status_zadania = 1; Koniec transakcji. Chodzi mi teraz o to czy transakcja obsluzy to tak jak mi sie wydaje, ze powinna obsluzyc ![]() Jak tak nad tym myslalem to powstaje mi takie pytanie: skad baza danych bedzie wiedziala, ze ta druga operacje wykonac na tym samym rekordzie i ze to wlasnie ten rekord ma byc powiekszony o jedna kolumne... I z tym sie wlasnie zwracam do Was - mam nadzieje, ze ktos takie cos przerabial albo chociaz wie teoretycznie jak to rozwiazac. Z gory dziekuje za wszelka pomoc... -------------------- "Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 20 Pomógł: 0 Dołączył: 18.12.2003 Ostrzeżenie: (0%) ![]() ![]() |
Niestety, ale Twoj kod doda do tabeli TabelaStatystyk dwa rekordy (niezaleznie od tego, czy obejmiesz INSERTy transakcja, czy nie).
-------------------- WebHelp.pl
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 68 Pomógł: 0 Dołączył: 10.07.2003 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
A gdybym w transakcji zrobil cos takiego, ze najpierw bym utworzyl zmienna, w ktora bym wrzucil wynik select liczacego ilosc wykonanych zadan, a jako drugie polecenie selecta po calosci (czyli te pozostale dane) i w nim w pole, w ktorym mialaby sie znalezc ilosc wykonanych zadan bym "wrzucil" ta zmienna? Tak by zadzialalo?
-------------------- "Jedyną pewną metodą unikania porażek jest nie mieć żadnych, nowych pomysłów."
Albert Einstein |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 50 Pomógł: 0 Dołączył: 17.08.2004 Ostrzeżenie: (0%) ![]() ![]() |
dobrze kombinujesz, tylko do tego celu musisz chyba uzrzyc juz proceduralnego SQL'a.
zrob to mniej wiecej tak. przykladowy blok anonimowy Kod DECLARE wszystkie NUMBER; wykonane NUMBER; BEGIN SELECT count(id_zadania) INTO wszystkie FROM TabelaZadan; SELECT count(id_zadania) INTO wykonane FROM TabelaZadan WHERE status_zadania = 1; INSERT INTO TabelaSatystyk VALUES(wszystkie,wykonane); END nigdy osobiscie czegos takiego nie pisalem, ale z teori wydaje mi sie ze taki bloczek mniej wiecej bygladal by tak. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.07.2025 - 15:06 |