(又一个) "Missing Right Parenthesis"



我使用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);

免疫注射是从疫苗批次中提取的。"剂量量级"是指一种特定的免疫注射使用了多少剂量。vaccine_lot中的"剂量"栏显示了标准免疫注射的剂量。所以标准的一针可能是0.1毫升。但一次免疫注射实际上可能使用0.2cc甚至0.05cc。vaccine_lot_transaction中的"Quantity"列最初记录了一批疫苗包含多少标准免疫注射。

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

下面是使用我们刚刚插入的数据的示例。我们有一批疫苗(批号为‘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
);

果然,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


顺便说一下,我使用的是SQL*Plus的10.2.0.1.0版本。当使用SQL Developer(版本3.0.04)时,我得到了相同的结果。

有人能帮忙看一下这个问题吗?谢谢!

我剪切并粘贴了你的代码,它似乎对我有用(我相信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

相关内容

  • 没有找到相关文章

最新更新