2013-06-25 13 views
5

quando entro in questoRicevo un errore nel comando SQL non correttamente concluso

INSERT INTO works_on 
(essn, pno, hours) 
values 
('123456789', 1, 32.5), 
('123456789', 2, 7.5), 
('666884444', 3, 40.0), 
('453453453', 1, 20.0), 
('453453453', 2, 20.0), 
('333445555', 2, 10.0), 
('333445555', 3, 10.0), 
('333445555', 10, 10.0), 
('333445555', 20, 10.0), 
('999887777', 30, 30.0), 
('999887777', 10, 10.0), 
('987987987', 10, 35.0), 
('987987987', 30, 5.0), 
('987654321', 30, 20.0), 
('987654321', 20, 15.0), 
('888665555', 20, 0); 

ottengo

ORA-00933 l'errore seguente: comando SQL non correttamente concluso

+0

Non è così che si inserisce inserti multiriga in Oracle, bisogna usare il loro strano inserto multi-tavolo combinato con una doppia selezione (ugh!). – paxdiablo

risposta

6

In Oracle, non è possibile specificare più serie di valu es come questo (suppongo che tu venga da uno sfondo MySQL dove questa sintassi è consentita). L'approccio più semplice è quello di generare più INSERT dichiarazioni

INSERT INTO works_on 
(essn, pno, hours) 
values 
('123456789', 1, 32.5); 

INSERT INTO works_on 
(essn, pno, hours) 
values 
('123456789', 2, 7.5); 

INSERT INTO works_on 
(essn, pno, hours) 
values 
('666884444', 3, 40.0); 

... 

È anche possibile inserire più righe utilizzando una singola INSERT ALL dichiarazione

INSERT ALL 
    INTO works_on(essn, pno, hours) values('123456789', 1, 32.5) 
    INTO works_on(essn, pno, hours) values('123456789', 2, 7.5) 
    INTO works_on(essn, pno, hours) values('666884444', 3, 40.0) 
    INTO works_on(essn, pno, hours) values('453453453', 1, 20.0) 
    INTO works_on(essn, pno, hours) values('453453453', 2, 20.0) 
    INTO works_on(essn, pno, hours) values('333445555', 2, 10.0) 
    INTO works_on(essn, pno, hours) values('333445555', 3, 10.0) 
    ... 
SELECT * 
    FROM dual; 
+0

Questa deve essere una _new_ definizione della parola "semplice" di cui prima non ero a conoscenza. Ma +1 dato che hai ragione. Dovrei aspettarmi un po 'di più da un fornitore di DBMS che non sia in grado di distinguere tra un NULL e una stringa vuota :-) – paxdiablo

+0

Questa soluzione ha funzionato. Come puoi vedere, io sono un noob su questa roba e questa è la mia prima classe di database di sempre. Grazie. – UnPatoCuacCuac

+0

Cos'è questo 'dual'? – AlwaysLearning

0

try prendere uno sguardo al this dal merletto

 
Oracle SQL uses a semi-colon ; as its end of statement marker. 

you will need to add the ; after bother insert statments. 

NB: that also assumes ADODB will allow 2 inserts in a single call. 

the alternative might be to wrap both calls in a block, 

    BEGIN 
      insert (...) into (...); 
      insert (...) into (...); 
    END; 
1

Non è possibile combinare tutti i valori in un unico inserto del genere in Oracle purtroppo. Si sia possibile separare le istruzioni SQL, o utilizzare un altro approccio come questo per l'esecuzione in una singola istruzione:

INSERT INTO works_on (essn, pno, hours) 
SELECT '123456789', 1, 32.5 FROM DUAL UNION 
SELECT '123456789', 2, 7.5 FROM DUAL UNION 
SELECT '666884444', 3, 40.0 FROM DUAL UNION 
SELECT '453453453', 1, 20.0 FROM DUAL UNION 
... 
SELECT '987987987', 30, 5.0 FROM DUAL UNION 
SELECT '987654321', 30, 20.0 FROM DUAL UNION 
SELECT '987654321', 20, 15.0 FROM DUAL UNION 
SELECT '888665555', 20, 0 FROM DUAL 

SQL Fiddle Demo

0

La sintassi VALUES supporta l'inserimento di un solo voci in un database. Nel ORACLE FAQs, il seguente è suggerito:

INSERT ALL 
INTO works_on (essn, pno, hours) VALUES ('123456789', 1, 32.5) 
INTO works_on (essn, pno, hours) VALUES ('123456789', 2, 7.5) 
INTO works_on (essn, pno, hours) VALUES ('666884444', 3, 40.0) 
INTO works_on (essn, pno, hours) VALUES ('453453453', 1, 20.0) 
INTO works_on (essn, pno, hours) VALUES ('453453453', 2, 20.0) 
INTO works_on (essn, pno, hours) VALUES ('333445555', 2, 10.0) 
INTO works_on (essn, pno, hours) VALUES ('333445555', 3, 10.0) 
INTO works_on (essn, pno, hours) VALUES ('333445555', 10, 10.0) 
INTO works_on (essn, pno, hours) VALUES ('333445555', 20, 10.0) 
INTO works_on (essn, pno, hours) VALUES ('999887777', 30, 30.0) 
INTO works_on (essn, pno, hours) VALUES ('999887777', 10, 10.0) 
INTO works_on (essn, pno, hours) VALUES ('987987987', 10, 35.0) 
INTO works_on (essn, pno, hours) VALUES ('987987987', 30, 5.0) 
INTO works_on (essn, pno, hours) VALUES ('987654321', 30, 20.0) 
INTO works_on (essn, pno, hours) VALUES ('987654321', 20, 15.0) 
INTO works_on (essn, pno, hours) VALUES ('888665555', 20, 0) 
SELECT * FROM dual; 
-3
INSERT INTO 
WORKS_ON VALUES 
(&ESSN,&PNO,&HOURS); 

Dopo u'll ottenere come qui di seguito dat.

ENTER VALUE FOR ESSN: IN THIS U ENTER 123456789 

ENTER VALUE FOR PNO: IN THIS U ENTER 1 

ENTER VALUE FOR HOURS:32.5 

Dopo che si otterrà:

1 FILA NASCE

Quindi digitare '/' simbolo e premere invio. Otterrai per entrare per inserire un'altra riga in quel tavolo.

Seguire la procedura precedente per un modo semplice di inserire la riga nei tavoli.

+3

Per favore, non c'è bisogno di urlare. E il testo in maiuscolo è meno leggibile. Prova a riformattarlo se possibile –

Problemi correlati