加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – (又一个)“缺少正确的括号”

发布时间:2020-12-12 13:15:30 所属栏目:百科 来源:网络整理
导读:我正在使用10g,我正在尝试进行一些简单的计算,然后将结果保存在一列中.实际的表有更多列,但以下是我在查询中使用的内容: CREATE TABLE "VACCINE_LOT"( "VACCINE_LOT_ID" NUMBER(10,0) NOT NULL ENABLE,"DOSE" NUMBER(6,3),"QUANTITY_ON_HAND" NUMBER(12,2)
我正在使用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,"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’是一个特定的免疫注射使用了多少. vaccine_lot中的’Dose’列显示了标准免疫注射的使用量.所以标准镜头可能是0.1cc.但是一次免疫射击实际上可能使用0.2cc甚至0.05cc. vaccine_lot_transaction中的“数量”列最初记录疫苗批次包含的标准免疫注射数量.

我在这里要做的是为疫苗批次计算正确的’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

顺便说一下,我使用的是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,4    "DOSE"             NUMBER(6,5    "QUANTITY_ON_HAND" NUMBER(12,2) NOT NULL ENABLE
  6  );

Table created.

SQL> CREATE TABLE "IMMUNIZATION"
  2  (
  3    "VACCINE_LOT_ID" NUMBER(10,4    "DOSE_MAGNITUDE" NUMBER(4,2)
  5  );

Table created.

SQL> CREATE TABLE "VACCINE_LOT_TRANSACTION"
  2  (
  3    "VACCINE_LOT_ID" NUMBER(10,4    "QUANTITY"       NUMBER(12,2) NOT NULL ENABLE
  5  );

Table created.

SQL> INSERT INTO vaccine_lot VALUES (100,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读