2008-11-20 6 views
15

Executing die Linie von SQL:Oracle-Fehler: ORA-00905: Fehlendes Stichwort

SELECT * 
    INTO assignment_20081120 
    FROM assignment ; 

gegen eine Datenbank in Oracle eine Tabelle namens Zuordnung zu sichern, gibt mir die folgenden ORACLE-Fehler: ORA-00905: Fehlende Stichwort

+0

Für diejenigen, die dies von einer Google-Suche wie ich, obwohl nicht der einzige Grund, warum das obige fehlschlägt, habe ich diesen Fehler, wenn ich eine Variable deklariert, ohne seinen Typ anzugeben. – vapcguy

Antwort

18

es sei denn, es eine einzige Zeile in der Tabelle ASSIGNMENT und ASSIGNMENT_20081120 ist eine lokale PL/SQL-Variable vom Typ ASSIGNMENT%ROWTYPE, das ist nicht das, was Sie wollen.

Angenommen, Sie versuchen, eine neue Tabelle zu erstellen und die vorhandenen Daten auf die neue Tabelle kopieren

CREATE TABLE assignment_20081120 
AS 
SELECT * 
    FROM assignment 
3

Zuerst dachte ich:

"...In Microsoft SQL Server the SELECT...INTO automatically creates the new table whereas Oracle seems to require you to manually create it before executing the SELECT...INTO statement..."

aber nach einer Tabelle manuell zu erzeugen, ist es nach wie vor funktionierte nicht und zeigte immer noch den "missing keyword" -Fehler.

Also gab ich dieses Mal auf und löste es, indem zuerst die Tabelle manuell zu erstellen, dann die „klassischen“ SELECT Anweisung:

INSERT INTO assignment_20081120 SELECT * FROM assignment; 

Welche wie erwartet funktioniert. Wenn jemand mit einer Erklärung darüber, wie man die SELECT...INTO in einer korrekten Weise verwenden, würde ich mich freuen!

+4

Die Erklärung ist einfach, dass "SELECT..INTO" ist * PL/SQL * -Syntax, nicht SQL - erwartet eine PL/SQL-Variable das Ergebnis der Abfrage zu akzeptieren. –

3

Sie können auswählen, in innerhalb eines PLSQL-Blocks wie unten.

Declare 
    l_variable assignment%rowtype 
begin 
    select * 
    into l_variable 
    from assignment; 
exception 
    when no_data_found then 
    dbms_output.put_line('No record avialable') 
    when too_many_rows then 
    dbms_output.put_line('Too many rows') 
end; 

Dieser Code wird nur funktionieren, wenn es genau 1 Zeile in Zuordnung gibt. Normalerweise verwenden Sie diese Art von Code, um eine bestimmte Zeile auszuwählen, die durch eine Schlüsselnummer identifiziert wird.

Declare 
    l_variable assignment%rowtype 
begin 
    select * 
    into l_variable 
    from assignment 
    where ID=<my id number>; 
exception 
    when no_data_found then 
    dbms_output.put_line('No record avialable') 
    when too_many_rows then 
    dbms_output.put_line('Too many rows') 
end; 
0

Späte Antwort, aber ich kam gerade auf diese Liste heute!

CREATE TABLE Zuordnung_20101120 AS SELECT * FROM Zuweisung;

Hat das gleiche.

+7

Das hat Justin Cave vor fast zwei Jahren gesagt ... –

0

Obwohl dies nicht direkt mit der genauen Frage des OP verbunden ist, habe ich gerade herausgefunden, dass die Verwendung eines Oracle reservierten Wortes in Ihrer Abfrage (in meinem Fall der Alias ​​IN) den gleichen Fehler verursachen kann.

Beispiel:

SELECT * FROM TBL_INDEPENTS IN 
JOIN TBL_VOTERS VO on IN.VOTERID = VO.VOTERID 

Oder wenn seine in der Abfrage selbst als Feldname

SELECT ..., ...., IN, ..., .... FROM SOMETABLE 

, die auch diesen Fehler werfen würde. Ich hoffe, das hilft jemandem.