2011-11-22 7 views
5

Sto usando 10g e sto cercando di fare un semplice calcolo e quindi salvare il risultato in una colonna. Le tabelle attuali hanno molte più colonne, ma qui sono i quello che sto usando nella mia interrogazione: scatti(Ancora un altro) "Parentesi destra mancante"

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

di immunizzazione sono presi da un sacco di vaccino. 'Dose_magnitude' è quanto un particolare colpo di vaccinazione utilizza da molto. La colonna "Dose" in vaccine_lot indica quanto usare per un tiro di immunizzazione standard. Quindi un colpo standard può essere 0.1cc. Ma un colpo di vaccinazione può effettivamente usare 0,2 cc o anche 0,05 cc. La colonna "Quantità" in vaccine_lot_transaction registra in origine il numero di vaccinazioni standard che un lotto di vaccino contiene.

Quello che sto cercando di fare qui è quello di calcolare la quantità corretta di "Quantità di mani" per i lotti di vaccini (cioè quanti vaccini standard di immunizzazione sono ancora disponibili per i lotti di vaccino).

Ecco un esempio utilizzando i dati che abbiamo appena inserito. Abbiamo un lotto di vaccini (l'ID del lotto è '100'), e inizia con 150 colpi standard (cioè contiene 150 colpi da 0,2 cc). Ci sono già due colpi di vaccinazione da questo lotto, uno da 0,2 cc, l'altro da 0,3 cc). E l'attuale quantità di 120 è ovviamente sbagliata, e abbiamo bisogno di ricalcolarlo e aggiornarlo.

Ecco la mia domanda:

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

E infatti, Oracle inizia a lamentarsi "mancanti parentesi destra". Sembra che pensi che ci sia qualcosa di sintatticamente sbagliato.

Qualcuno può aiutare a dare un'occhiata a questa query e vedere cosa c'è di sbagliato in esso? Grazie!

Questo è ciò che ottengo quando l'eseguo tramite 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 


A proposito, sto usando la versione 10.2.0.1.0 di SQL * Plus. Ottengo lo stesso risultato quando utilizzo SQL Developer (versione 3.0.04).

Qualcuno può dare un'occhiata a questo problema? Grazie!

+3

Grazie mille per aver pubblicato definizioni di tabelle e dati di esempio! Sarebbe anche utile indicare esplicitamente quale dovrebbe essere il risultato atteso dell'istruzione 'UPDATE'. Penso che un 'QUANTITY_ON_HAND' di 147.5 sia corretto, ma tu ovviamente sai meglio di me quello che vuoi che sia il risultato. –

+0

Nel tuo copia e incolla da SQL * Plus, sembra che qualcosa venga interrotto. Quando hai pubblicato la tua query inizialmente (e quando l'ho eseguita) c'era un extra 't_id) -' sulla riga 4. Se non è effettivamente lì, verrebbe visualizzato un errore di parentesi mancante. –

+0

Era un problema di visualizzazione, credo. Ho riformattato la query in modo che nulla venga troncato (vedi il mio post originale, che è stato aggiornato), e ho ancora finito con lo stesso risultato. – Hua

risposta

2

Ho tagliato e incollato il codice e sembra funzionare per me (credo che il risultato finale di 147.5 sia corretto). Sei sicuro di non aver accidentalmente semplificato il problema troppo lontano?

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

Grazie per la tua risposta Justin.
Questo mi sconcerta perché utilizzo 10g e continua a darmi lo stesso errore su SQL Developer e SQL plus ... – Hua

+0

@ user1060340 - Puoi fare un copia-incolla da SQL * Plus proprio come ho fatto io che mostra l'errore che stai ottenendo? Stai utilizzando una versione ragionevolmente recente di SQL * Plus? O stai usando una versione precedente di SQL * Plus per accedere a un database 10g? –

+0

SQL> eseguire 1 UPDATE vaccine_lot V SET quantity_on_hand = 2 ( 3 ( 4 (SELEZIONARE T.quantity * V.dose FROM vaccine_lot_transaction T WHERE V.vaccine_lot_id = T.vaccine_lo 5 (SELECT SUM (I.dose_magnitude) FROM WHERE I immunizzazione I.vaccine_lot_id = V.vaccine_lot_id) 6)/dose 7 *); (SELECT * T.quantity V.dose FROM vaccine_lot_transaction T dove V.vaccine_lot_id = T.vaccine_lot ERRORE alla linea 4: ORA-00907: parentesi destra mancante
A proposito, sto usando la versione 10.2.0.1.0 di SQL * Plus. Ottengo lo stesso risultato quando si usa SQL Devel oper (versione 3.0.04). Grazie ancora! – Hua

Problemi correlati