2009-04-18 5 views
2

Meine Frage:Warum erzeugt meine Abfrage den Fehler "ORA-00933: SQL-Befehl nicht ordnungsgemäß beendet"?

CREATE VIEW cambiodatos AS 
SELECT 
    a.last_name||','||a.first_name AS "Nombre", 
    a.salary AS "Salario", 
    b.name AS "Nombre Departamento", 
    c.name AS "Nombre de Region" 
FROM 
    s_emp a, s_dept b, s_region c 
WHERE 
    a.dept_id = b.id AND b.region_id = c.id 

UPDATE 
    cambiodatos 
SET 
    name = 'North America' 
WHERE 
    last_name = 'Biri'||','||first_name = 'Ben' 

Der Fehler:

ORA-00933: SQL command not properly ended 

Antwort

0

Sieht aus wie Sie ein und in der

Update wollen
UPDATE 
    cambiodatos 
SET 
    name = 'North America' 
WHERE 
    last_name = 'Biri' AND first_name = 'Ben' 
+0

Weder last_name noch first_name befinden sich in der Ansicht als Spalten. –

+0

Korrigieren, aber das Problem beheben wird die fragliche Fehlermeldung los, aber es wird natürlich nur verschiedene Fehlermeldungen später erzeugen. –

0

ich Oracle nicht während der letzten 7 verwendet haben Jahre oder so, aber brauchst du keins; am Ende der Aussagen?

+0

Nein, Sie brauchen am Ende der Oracle-SQL-Anweisungen kein Semikolon, aber Sie können es verwenden, um sqlplus mitzuteilen, dass die Anweisung vollständig ist und um sie zu senden. Das kann aber auch mit '/' in einer Zeile nach der SQL-Anweisung geschehen. Ohne diese würde die Anweisung nicht an den DB-Server gesendet werden, so dass kein Fehler bezüglich der Befehlsendung erzeugt würde. –

+0

@Shannon Severance Natürlich hast du recht, aber das war etwas, was ich ihm erklären wollte (auch wenn Quassnoi es besser gemacht hat). Als Oracle ihm sagte, dass die Aussage nicht korrekt beendet wurde, nahm ich an, dass er sie von sqlplus schickte. Es ist keine Oracle-spezifische Sache, die meisten Datenbanken funktionieren gleich. ';' ist fast immer gültig, aber die meisten haben auch alternative Enden. In diesem Fall bin ich mir ziemlich sicher, dass die gesamte Anweisung (mit CREATE VIEW und UPDATE verarbeitet wurde und als sie das UPDATE-Schlüsselwort sah, weil klar war, dass die CREATE VIEW-Anweisung nicht korrekt beendet wurde. – Fredrik

+0

Sie lesen näher als ich Ich werde meine Stimme nicht korrigieren lassen. –

0

Zunächst denke ich, dass Ihr UPDATE-Befehl schlecht formatiert ist. Zweitens verwenden Sie Felder aus den zugrunde liegenden Tabellen anstelle der Ansicht, für die Sie das Update ausführen. Außerdem glaube ich nicht, dass Sie eine Ansicht basierend auf einem Join aktualisieren können. Siehe die Antwort auf diese question. Wenn du vielleicht so aussehen könntest.

UPDATE 
    cambiodatos 
SET 
    [Nombre de Region] = 'North America' 
WHERE 
    Nombre = 'Biro, Ben' 
-1

CREATE VIEW cambiodatos AS a.last_name SELECT || '' || a.first_name AS "Nombre", a.salary AS "Salario", b.name AS "Nombre Departamento" , c.name AS "Nombre de Region" vON s_emp a, b s_dept, s_region c WHERE a.dept_id = b.id UND b.region_id = c.id; /* fehlendes Semikolon? */

UPDATE cambiodatos SET name = 'Nordamerika' WHERE last_name = 'Biri' || '' || first_name = 'Ben'/* ein und last_name = <> AND first_name fehlt = <> */

1

Zuerst trennen Sie Abfragen mit einem Semikolon und fixieren Sie Ihre SET Bedingungen:

CREATE VIEW cambiodatos AS 
SELECT 
    a.last_name||','||a.first_name AS "Nombre", 
    a.salary AS "Salario", 
    b.name AS "Nombre Departamento", 
    c.name AS "Nombre de Region" 
FROM 
    s_emp a, s_dept b, s_region c 
WHERE 
    a.dept_id = b.id AND b.region_id = c.id; 

UPDATE 
    cambiodatos 
SET 
    name = 'North America' 
WHERE 
    last_name = 'Biri' 
    AND first_name = 'Ben' 

das ist der Grund Ihrer Fehler ist ORA-00933

Zweitens schlägt Ihre UPDATE-Anweisung fehl, da die von Ihnen erstellte Ansicht kein Feld name enthält.

wird diese Abfrage kompilieren:

UPDATE 
    cambiodatos 
SET 
    "Nombre de Region" = 'North America' 
WHERE 
    "Nombre" = 'Biri, Ben' 

, aber die meisten wahrscheinlich scheitern wird als s_region in dieser Ansicht nicht key-preserved ist.

zu aktualisieren, verwenden Sie stattdessen:

MERGE 
INTO s_region c 
USING (
     SELECT b.region_id 
     FROM s_emp a, s_dept b 
     WHERE a.last_name || ',' || a.first_name = 'Biri, Ben' 
       AND b.id = a.dept_id 
     ) q 
ON  c.id = q.region_id 
WHEN MATCHED THEN 
UPDATE 
SET  c.name = 'North America' 
2

Der genaue Grund dafür, warum Sie diesen Fehler bekommen ist, dass Sie diese WHERE-Klausel:

last_name = 'Biri'||','||first_name = 'Ben' 

Dies ist keine rechtliche Syntax .

Dies wäre:

last_name = 'Biri' AND first_name = 'Ben' 

Oder etwas Ähnliches:

name = 'Biri'||','||'Ben' 

aber dann könnte man es einfach so schreiben:

name = 'Biri,Ben' 

Das Problem ist, dass es aussieht zu mir, dass du den zweiten || verwendest da als AND-Klausel, aber das passt nicht in das Komma, das Sie hinzufügen möchten.

Vielleicht versuchen Sie, dies auszuführen?

last_name || ',' || first_name = 'Biri,Ben' 

In jedem Fall, wie andere haben darauf hingewiesen, wenn Sie diese Syntax Problem zu beheben, werden Sie andere Fehlermeldung nur Spaltennamen über vermisst.

Verwandte Themen