(Еще один) "Отсутствует правильная скобка" - PullRequest
5 голосов
/ 22 ноября 2011

Я использую 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).

Кто-нибудь может помочь взглянуть на эту проблему? Спасибо!

1 Ответ

2 голосов
/ 22 ноября 2011

Я вырезал и вставил ваш код, и он, кажется, работает для меня (я считаю, что конечный результат 147.5 является правильным). Вы уверены, что случайно не упростили проблему слишком далеко?

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