2011-11-22 16 views
5

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!

+3

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ąć. –

+0

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. –

+0

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

Odpowiedz

2

Wycinam i wklejałem twój kod i wydaje się, że działa on dla mnie (uważam, że wynik końcowy z 147,5 jest poprawny). Czy na pewno nie udało Ci się zbytnio uprościć problemu?

SQL> CREATE TABLE "VACCINE_LOT" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    4 "DOSE"    NUMBER(6,3), 
    5 "QUANTITY_ON_HAND" NUMBER(12,2) NOT NULL ENABLE 
    6 ); 

Table created. 

SQL> CREATE TABLE "IMMUNIZATION" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0), 
    4 "DOSE_MAGNITUDE" NUMBER(4,2) 
    5 ); 

Table created. 

SQL> CREATE TABLE "VACCINE_LOT_TRANSACTION" 
    2 (
    3 "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE, 
    4 "QUANTITY"  NUMBER(12,2) NOT NULL ENABLE 
    5 ); 

Table created. 

SQL> INSERT INTO vaccine_lot VALUES (100, 0.2, 120); 

1 row created. 

SQL> INSERT INTO immunization VALUES (100, 0.2); 

1 row created. 

SQL> INSERT INTO immunization VALUES (100, 0.3); 

1 row created. 

SQL> INSERT INTO vaccine_lot_transaction VALUES (100, 150); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> UPDATE vaccine_lot V SET quantity_on_hand = 
    2 (
    3 (
    4  (SELECT T.quantity * V.dose FROM vaccine_lot_transaction T WHERE V.vacci 
ne_lot_id = T.vaccine_lot_id) - 
    5  (SELECT SUM(I.dose_magnitude) FROM immunization I WHERE I.vaccine_lot_id 
= V.vaccine_lot_id) 
    6 )/dose 
    7 ); 

1 row updated. 

SQL> select * from vaccine_lot; 

VACCINE_LOT_ID  DOSE QUANTITY_ON_HAND 
-------------- ---------- ---------------- 
      100   .2   147.5 
+0

Dzięki za odpowiedź Justin.
To naprawdę zaskakuje mnie, ponieważ używam 10g i ciągle daje mi ten sam błąd zarówno dla programisty SQL, jak i SQL plus ... – Hua

+0

@ user1060340 - Czy możesz zrobić cięcie i wkleić z SQL * Plus, tak jak ja który pokazuje błąd, który otrzymujesz? Czy używasz dość aktualnej wersji SQL * Plus? Czy używasz starszej wersji SQL * Plus, aby uzyskać dostęp do bazy danych 10g? –

+0

SQL> run 1 UPDATE vaccine_lot Vset quantity_on_hand = 2 ( 3 ( 4 (SELECT T.quantity * V.dose Z vaccine_lot_transaction T gdzie V.vaccine_lot_id = T.vaccine_lo 5 (SELECT SUM (I.dose_magnitude) z immunizacji I, w którym I.vaccine_lot_id = V.vaccine_lot_id) 6)/dawkę 7 *) (SELECT T.quantity * V.dose z vaccine_lot_transaction T gdzie V.vaccine_lot_id = T.vaccine_lot Błąd w wierszu 4: ORA-00907: brakuje nawiasu prawego
Swoją drogą używam wersji 10.2.0.1.0 z SQL * Plus. Otrzymuję ten sam wynik przy użyciu SQL Devel oper (wersja 3.0.04). Dzięki jeszcze raz! – Hua