Я использую 10g, и я пытаюсь сделать несколько простых расчетов, а затем сохранить результат в столбце. В реальных таблицах есть еще много столбцов, но вот что я использую в своем запросе:
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);
прививки сделаны с участка вакцины. «Dose_magnitude» - это то, сколько конкретный прививочный выстрел использует из множества. Столбец «Доза» в Vacine_lot указывает, сколько нужно использовать для стандартного прививки. Таким образом, стандартный выстрел может быть 0.1cc. Но один выстрел иммунизации может фактически использовать 0.2cc или даже 0.05cc. Столбец «Количество» вacvac_lot_transaction первоначально записывает, сколько стандартных прививок содержится в партии вакцин.
То, что я пытаюсь сделать здесь, - это рассчитать правильное «Количество_полученных» для партий вакцин (то есть, сколько стандартных прививок еще осталось для партий вакцин).
Вот пример использования данных, которые мы только что вставили. У нас есть партия вакцин (идентификатор партии «100»), и она начинается с 150 стандартных выстрелов (то есть, она содержит 150 выстрелов по 0,2 куб. См). Из этого лота уже есть два прививки: один 0,2 куб. См, другой 0,3 куб. См). И текущее количество 120, очевидно, неверно, и нам нужно пересчитать и обновить его.
Вот мой запрос:
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
);
И, конечно же, Oracle начинает жаловаться на "отсутствие правильных скобок". Похоже, он думает, что синтаксически что-то не так.
Может кто-нибудь помочь взглянуть на этот запрос и посмотреть, что с ним не так? Спасибо!
Это то, что я получаю, когда запускаю его через 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
Кстати, я использую версию 10.2.0.1.0 SQL * Plus. Я получаю тот же результат при использовании SQL Developer (версия 3.0.04).
Кто-нибудь может помочь взглянуть на эту проблему? Спасибо!