2011-11-22 24 views
5

10g kullanıyorum ve basit bir hesaplama yapmaya çalışıyorum ve sonucu bir sütuna kaydedin. Gerçek tablo çok daha fazla sütuna sahip, ama burada benim sorguda kullanıyorum ne:(Yine başka) "Eksik Sağ Parantez"

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); 

Bağışıklama çekimler aşı partisinin alınır. 'Dose_magnitude', belirli bir aşılama atışının ne kadar çok kullandığıdır. Vaccine_lot'daki 'Doz' sütunu standart bir aşılama çekimi için ne kadar kullanılacağını anlatır. Yani standart bir atış 0,1cc olabilir. Ancak bir aşılama vuruşu aslında 0.2cc veya hatta 0.05cc kullanabilir. Vaccine_lot_transaction'daki 'Quantity' sütunu, aslen bir aşı partisinin kaç tane standart immünizasyon çekildiğini kaydeder.

Burada yapmaya çalıştığım şey, aşı lotları için doğru 'Quantity_on_hand' (yani aşı partileri için kaç standart immünizasyon çekimi kalıyorsa) hesaplamaktır.

Eklediğimiz verileri kullanarak bir örnek. Aşı lotumuz var (lot ID '100') ve 150 standart çekim ile başlıyor (yani 150 0.2cc çekim yapıyor). Bu lottan şimdiden iki aşılama çekimi var, bir 0.2cc, diğer 0,3cc). Ve şu andaki 120 miktarı açıkça yanlıştır ve yeniden hesaplamalı ve güncellemeliyiz.

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 
); 

Ve tabii, Oracle "sağ parantez eksik" şikayet başlar:

İşte benim sorgusu olur. Sözdiziminde yanlış bir şey olduğunu düşünüyor gibi görünüyor.

Herkes bu sorguya bir göz atıp neyin yanlış olduğunu görmesine yardımcı olabilir mi? Teşekkürler!

Bu SQL * aracılığıyla çalıştırdığınızda ne alıyorum ARTI: Bu arada

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 


, ben SQL * Plus sürümü 10.2.0.1.0 kullanıyorum. SQL Developer'ı kullanırken aynı sonucu elde ediyorum (3.0.04 sürümü).

Bu konuya bir göz atmanıza yardımcı olan var mı? Teşekkürler!

+3

Tablo tanımlarını ve örnek verilerini gönderdiğiniz için çok teşekkürler! UPDATE ifadenizin beklenen sonucunun ne olacağını açıkça belirtmek de yararlı olacaktır. Ben bir 147 QUANTITY_ON_HAND'ının doğru olduğunu düşünüyorum, ancak kesin olarak sizin sonucun ne olmasını istediğinizden daha iyi biliyorsunuz. –

+0

Kesim ve yapıştırma işleminizde SQL * Plus, bir şey kesiliyor gibi görünüyor. Sorgunuzu ilk başta (ve çalıştırdığımda) 4. satırda fazladan bir 't_id') varsa, bu aslında yoksa, eksik bir parantez hatası alırsınız. –

+0

Bu inanıyorum görüntü sorunu oldu. Sorguyu yeniden biçimlendirdim, böylece hiçbir şey kesilmeyecek (lütfen güncellenen orijinal gönderiye bakın) ve yine de aynı sonucu elde ettim. – Hua

cevap

2

Kodunuzu kesip yapıştırdım ve bana göre çalışıyor gibi görünüyor (147.5 sonucunun doğru olduğuna inanıyorum). Sorunu yanlışlıkla çok fazla basitleştirmediğinizden emin misiniz?

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 
+0

Cevabınız için teşekkürler Justin.
Bu gerçekten beni şaşırtıyor çünkü 10g kullanıyorum ve hem SQL Developer hem de SQL'de aynı hatayı vermeye devam ediyor ... – Hua

+0

@ user1060340 - Yaptığım gibi SQL * Plus'tan bir kes-yapıştır yapamaz mısın? aldığınız hatayı gösteriyor? SQL * Plus'ın makul bir yeni sürümünü mi kullanıyorsunuz? Veya bir 10g veritabanına erişmek için SQL * Plus'ın eski bir sürümünü mi kullanıyorsunuz? –

+0

SQL> çalıştırmak 1 UPDATE vaccine_lot Vset quantity_on_hand = 2 ( 3 ( 4 (vaccine_lot_transaction T'den T.quantity * V.dose Where V.vaccine_lot_id = T.vaccine_lo 5 ((I.dose_magnitude SUM SEÇ) bağışıklamadan WHERE I.vaccine_lot_id = V.vaccine_lot_id) 6)/doz 7 *); (vaccine_lot_transaction: burada, V.vaccine_lot_id = T.vaccine_lot HATADAN hat 4'te T.quantity * V.dose SEÇİMİ: ORA-00907: eksik sağ parantez
Bu arada, SQL * Plus'ın 10.2.0.1.0 sürümünü kullanıyorum SQL Devel kullanırken aynı sonucu elde ediyorum oper (sürüm 3.0.04). Tekrar teşekkürler! – Hua