5

我正在使用 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' 是特定免疫注射的用量。疫苗批次中的“剂量”列说明标准免疫注射的用量。所以标准镜头可能是0.1cc。但一次免疫注射实际上可能使用 0.2cc 甚至 0.05cc。疫苗批次交易中的“数量”列最初记录了一个疫苗批次包含多少标准免疫注射。

我在这里尝试做的是计算疫苗批次的正确“Quantity_on_hand”(即,疫苗批次还剩下多少标准免疫注射)。

这是一个使用我们刚刚插入的数据的示例。我们有一个疫苗批次(批次 ID 为“100”),它以 150 次标准注射开始(即,它包含 150 次 0.2cc 注射)。这批已经有两个免疫注射,一个 0.2cc,另一个 0.3cc)。而现在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
);

果然,甲骨文开始抱怨“缺少右括号”。看起来它认为语法上有问题。

谁能帮忙看看这个查询,看看有什么问题?谢谢!

这是我通过 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)时,我得到了相同的结果。

谁能帮忙看看这个问题?谢谢!

4

1 回答 1

2

I cut and pasted your code and it seems to work for me (I believe the end result of 147.5 is correct). Are you sure that you didn't accidentally simplify the problem too far?

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
于 2011-11-22T19:23:46.450 回答