2013-06-25 11 views
5

, als ich diesenich einen Fehler in der SQL-Befehl immer nicht beendete richtig

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

gebe ich die folgenden Fehler

ORA-00933 erhalten: SQL-Befehl nicht richtig beendet

+0

Das ist nicht, wie Sie mehrzeilige Einfügung in Oracle tun, müssen Sie ihre seltsame Multi-Tabelle Einsatz in Kombination mit einem Dual-Select (ugh!) Verwenden. – paxdiablo

Antwort

6

In Oracle können Sie mehrere Sätze von valu nicht angegeben Es ist so (ich vermute, dass Sie von einem MySQL-Hintergrund kommen, wo diese Syntax erlaubt ist). Der einfachste Ansatz ist es, mehrere INSERT Aussagen

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

... 

Sie auch mehrere Zeilen mit einer einzigen INSERT ALL Anweisung

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

Dies muss eine _new_ Definition des Wortes "simple" sein, von der ich vorher keine Ahnung hatte. Aber +1, da hast du Recht. Ich sollte etwas mehr von einem DBMS-Anbieter erwarten, der den Unterschied zwischen einer NULL und einer leeren Zeichenfolge nicht unterscheiden kann :-) – paxdiablo

+0

Diese Lösung funktionierte. Wie Sie sehen können, bin ich ein Anfänger auf diesem Zeug und das ist meine erste Datenbank-Klasse überhaupt. Vielen Dank. – UnPatoCuacCuac

+0

Was ist das "dual"? – AlwaysLearning

0

versuchen nehmen ein Blick auf this von ShoeLace

 
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

Sie nicht alle Werte in einem einzigen Einsatz wie in Oracle leider kombinieren einfügen zu erzeugen. Sie können entweder die SQL-Anweisungen trennen, oder eine anderen Ansatz wie diese in einer einzigen Anweisung auszuführen:

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

Die VALUES Syntax unterstützt nur ein Eintrag in eine Datenbank einfügen. Im ORACLE FAQs wird folgende vorgeschlagen:

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

Nach u wird wie unten dat zu erhalten.

ENTER VALUE FOR ESSN: IN THIS U ENTER 123456789 

ENTER VALUE FOR PNO: IN THIS U ENTER 1 

ENTER VALUE FOR HOURS:32.5 

Danach Sie erhalten:

1 ROW

entsteht

Dann '/' Symbol und drücken Sie die Eingabetaste. Sie erhalten für Enter für das Einfügen einer anderen Zeile in diese Tabelle.

Folgen Sie dem obigen Verfahren für eine einfache Möglichkeit, eine Zeile in Tabellen einzufügen.

+3

Bitte, es gibt keine Notwendigkeit zu schreien. Und Großbuchstaben sind weniger lesbar. Versuchen Sie es nach Möglichkeit neu zu formatieren –