2008-11-20 80 views
15

excuting la línea de SQL:error de Oracle: ORA-00905: palabra clave que falta

SELECT * 
    INTO assignment_20081120 
    FROM assignment ; 

contra una base de datos en Oracle para copia de seguridad de una tabla llamada asignación me da el siguiente error ORACLE: ORA-00905: Falta palabra clave

+0

Para aquellos que encuentran esto en una búsqueda de Google como yo, aunque no es la única razón por la que falla lo anterior, obtuve este error cuando declare una variable sin especificar su tipo. – vapcguy

Respuesta

18

a menos que haya una sola fila en la tabla ASSIGNMENT y ASSIGNMENT_20081120 es una variable/SQL PL locales de tipo ASSIGNMENT%ROWTYPE, esto no es lo que desea.

Suponiendo que usted está tratando de crear una nueva tabla y copiar los datos existentes a la nueva tabla

CREATE TABLE assignment_20081120 
AS 
SELECT * 
    FROM assignment 
3

En primer lugar, pensé:

"...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..."

Pero después de generar manualmente una mesa, todavía no funcionó, todavía muestra el error "falta de palabra clave".

Así que renunció a este tiempo y lo resolvió por primera vez la creación manual de la tabla, a continuación, utilizando el "clásico" SELECT declaración:

INSERT INTO assignment_20081120 SELECT * FROM assignment; 

que funcionó como se esperaba. Si alguien viene con una explicación sobre cómo usar el SELECT...INTO de una manera correcta, ¡sería feliz!

+4

La explicación es simplemente que 'SELECT..INTO' es la sintaxis * PL/SQL *, no SQL: espera que una variable PL/SQL acepte el resultado de la consulta. –

3

Puede usar seleccionar en el interior de un bloque PLSQL como el siguiente.

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; 

Este código sólo funciona cuando hay exactamente 1 fila de asignación. Usualmente usará este tipo de código para seleccionar una fila específica identificada por un número de clave.

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

Última respuesta, pero acabo de aparecer en esta lista hoy!

CREAR TABLA assignment_20101120 AS SELECT * FROM asignación;

Hace lo mismo.

+7

Eso es lo que Justin Cave dijo hace casi dos años ... –

0

Aunque esto no está directamente relacionado con la pregunta exacta del OP pero descubrí que usar una palabra reservada de Oracle en su consulta (en mi caso, el alias IN) puede causar el mismo error.

Ejemplo:

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

O si su en la consulta como un nombre de campo

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

que también tirar ese error. Espero que esto ayude a alguien.

Cuestiones relacionadas