Ошибка Oracle: ORA-00905: отсутствует ключевое слово

Вычисление строки SQL:

SELECT * 
  INTO assignment_20081120 
  FROM assignment ;

против базы данных в oracle для резервного копирования таблицы с именем присваивания дает мне следующую ошибку ORACLE: ORA-00905: отсутствует ключевое слово

Ответы

Ответ 1

Если в таблице ASSIGNMENT нет одной строки, а ASSIGNMENT_20081120 - это локальная переменная PL/SQL типа ASSIGNMENT%ROWTYPE, это не то, что вы хотите.

Предполагая, что вы пытаетесь создать новую таблицу и скопировать существующие данные в эту новую таблицу

CREATE TABLE assignment_20081120
AS
SELECT *
  FROM assignment

Ответ 2

Во-первых, я подумал:

"... В Microsoft SQL Server SELECT...INTO автоматически создается новой таблицы, тогда как Oracle, похоже, вам необходимо вручную создать его перед выполнением SELECT...INTOутверждение..."

Но после ручного создания таблицы он все равно не работает, все еще показывая ошибку "отсутствует ключевое слово".

Итак, я сдался на этот раз и решил его, сначала создав таблицу вручную, а затем используя инструкцию "classic" SELECT:

INSERT INTO assignment_20081120 SELECT * FROM assignment;

Что работало, как ожидалось. Если кто-нибудь придумает объяснение того, как правильно использовать SELECT...INTO, я был бы счастлив!

Ответ 3

Вы можете использовать select внутри блока PLSQL, например, ниже.

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;

Этот код будет работать только в том случае, если в задании имеется ровно 1 строка. Обычно вы будете использовать этот тип кода, чтобы выбрать определенную строку, идентифицированную номером ключа.

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;

Ответ 4

Поздний ответ, но я только что пришел в этот список сегодня!

CREATE TABLE assign_20101120 AS SELECT * FROM assign;

То же самое.

Ответ 5

Хотя это напрямую не связано с точным вопросом OP, но я только что узнал, что использование зарезервированного слова Oracle в вашем запросе (в моем случае псевдоним IN) может привести к той же ошибке.

Пример:

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

Или если его в самом запросе как имя поля

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

Это также вызовет эту ошибку. Я надеюсь, что это помогает кому-то.