【问题标题】:(Yet another) "Missing Right Parenthesis"(又一个)“缺少右括号”
【发布时间】:2011-11-22 19:18:29
【问题描述】:

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

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

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

【问题讨论】:

  • 非常感谢您发布表定义和示例数据!明确说明UPDATE 语句的预期结果应该是什么也很有用。我认为 147.5 的 QUANTITY_ON_HAND 是正确的,但您显然比我更清楚您想要的结果是什么。
  • 在您从 SQL*Plus 中剪切和粘贴的过程中,似乎有些东西被剪切掉了。当您最初发布查询时(以及当我运行它时),第 4 行有一个额外的 t_id) -。如果实际上不存在,您会收到一个缺少括号的错误。
  • 我相信这是显示问题。我重新格式化了查询,以便没有任何内容被截断(请参阅我的原始帖子,已更新),我仍然得到相同的结果。

标签: oracle ora-00907


【解决方案1】:

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

【讨论】:

  • 感谢贾斯汀的回复。
    这真的让我感到困惑,因为我使用的是 10g,并且它在 SQL Developer 和 SQL plus 上一直给我同样的错误......
  • @user1060340 - 你能从 SQLPlus 中进行剪切和粘贴,就像我所做的那样显示你遇到的错误吗?您使用的是相当新的 SQLPlus 版本吗?还是您使用旧版本的 SQL*Plus 访问 10g 数据库?
  • SQL> 运行 1 UPDATEvaccine_lot V SET quantity_on_hand = 2 ( 3 ( 4 (SELECT T.quantity * V.dose FROM blink_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lo 5 (SELECT SUM(I. dose_magnitude) FROM immunization I WHERE I.vaccine_lot_id = V.vaccine_lot_id) 6 ) / dose 7* ); (SELECT T.quantity * V.dose FROM blink_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lot 错误在第 4 行:ORA-00907 : 缺少右括号
    顺便说一句,我使用的是10.2.0.1.0版的SQL*Plus。使用SQL Developer(3.0.04版)时得到相同的结果。再次感谢!
  • @user1060340 - 您可以将其添加到您的问题中以便保留格式吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 2018-04-10
  • 1970-01-01
  • 2021-11-10
  • 2012-11-01
  • 2019-05-08
相关资源
最近更新 更多