Używam 10g i próbuję wykonać proste obliczenia, a następnie zapisać wynik w kolumnie. Rzeczywiste tabele mają wiele więcej kolumn, ale oto co używam w moim zapytaniu: strzały(Jeszcze inny) "Brakujące prawe nawiasy"
CREATE TABLE "VACCINE_LOT"
(
"VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE,
"DOSE" NUMBER(6,3),
"QUANTITY_ON_HAND" NUMBER(12,2) NOT NULL ENABLE
)
CREATE TABLE "IMMUNIZATION"
(
"VACCINE_LOT_ID" NUMBER(10,0),
"DOSE_MAGNITUDE" NUMBER(4,2)
)
CREATE TABLE "VACCINE_LOT_TRANSACTION"
(
"VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE,
"QUANTITY" NUMBER(12,2) NOT NULL ENABLE
)
INSERT INTO vaccine_lot VALUES (100, 0.2, 120);
INSERT INTO immunization VALUES (100, 0.2);
INSERT INTO immunization VALUES (100, 0.3);
INSERT INTO vaccine_lot_transaction VALUES (100, 150);
szczepień są pobierane z partii szczepionki. "Dose_magnitude" określa, ile konkretnego szczepu immunizacyjnego wykorzystuje z dużej ilości. Kolumna "Dawka" w dziale szczepionki informuje o tym, ile można użyć dla standardowego szczepienia. Więc standardowy strzał może wynosić 0,1 cm3. Ale jeden zastrzyk z immunizacji może faktycznie użyć 0,2 cm3 lub nawet 0,05 cm3. Kolumna "Ilość" w pliku szczepionki_lot_transakcyjnej rejestruje początkowo, ile standardowych szczepionek zawiera seria szczepionek.
To, co próbuję tutaj zrobić, to obliczyć prawidłową "Ilość" dla partii szczepionek (to znaczy, ile standardowych szczepień wciąż pozostaje na partiach szczepionek).
Oto przykład użycia właśnie wprowadzonych danych. Mamy partię szczepionek (ID partii to "100") i zaczyna się od 150 standardowych zdjęć (to znaczy, że zawiera 150 strzałów 0,2 cm3). Są już dwa ujęcia szczepień z tej serii, jedna 0,2 cm3, a druga 0,3 cm3). Obecna ilość 120 jest oczywiście błędna i musimy ją przeliczyć i zaktualizować.
Oto moje zapytanie:
UPDATE vaccine_lot V SET quantity_on_hand =
(
(
(SELECT T.quantity * V.dose FROM vaccine_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lot_id) -
(SELECT SUM(I.dose_magnitude) FROM immunization I WHERE I.vaccine_lot_id = V.vaccine_lot_id)
)/dose
);
I na pewno wystarczy, Oracle zaczyna narzekać "brakuje prawy nawias". Wygląda na to, że uważa, że jest coś syntaktycznie błędnego.
Czy ktoś może rzucić okiem na to zapytanie i zobaczyć, co jest z nim nie tak? Dzięki!
To co mam, kiedy go uruchomić poprzez SQL * Plus:
SQL> run
1 UPDATE vaccine_lot V SET quantity_on_hand =
2 (
3 (
4 (SELECT T.quantity * V.dose FROM vaccine_lot_transaction T
5 WHERE V.vaccine_lot_id = T.vaccine_lot_id) -
6 (SELECT SUM(I.dose_magnitude) FROM immunization I
7 WHERE I.vaccine_lot_id = V.vaccine_lot_id)
8 )/dose
9*);
WHERE V.vaccine_lot_id = T.vaccine_lot_id) -
*
ERROR at line 5:
ORA-00907: missing right parenthesis
Nawiasem mówiąc, używam wersji 10.2.0.1.0 z SQL * Plus. Otrzymuję ten sam wynik przy użyciu SQL Developer (wersja 3.0.04).
Czy ktoś może pomóc w obejrzeniu tego problemu? Dzięki!
Dziękuję bardzo za opublikowanie definicji tabel i przykładowych danych! Przydatne byłoby również jawne określenie, jaki powinien być oczekiwany rezultat twojego polecenia 'UPDATE'. Myślę, że "QUANTITY_ON_HAND" z 147,5 jest poprawne, ale oczywiście wiesz lepiej niż ja, co chcesz osiągnąć. –
Podczas wycinania i wklejania z SQL * Plus wygląda na to, że coś jest odcięte. Kiedy wysłałeś zapytanie na początku (i kiedy je uruchomiłem), na linii 4. pojawił się dodatkowy "t_id) -'". Jeśli tak nie jest, otrzymasz błąd braku nawiasu. –
To był problem z wyświetlaniem, jak sądzę. Ponownie sformatowałem zapytanie, aby nic nie zostało odcięte (zapoznaj się z moim oryginalnym wpisem, który został zaktualizowany), a ja wciąż otrzymywałem ten sam wynik. – Hua