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

Исключая строку SQL:

SELECT * 
  INTO assignment_20081120 
  FROM assignment ;

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

5 ответов

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

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

CREATE TABLE assignment_20081120
AS
SELECT *
  FROM assignment

Сначала я подумала:

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

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

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

INSERT INTO assignment_20081120 SELECT * FROM assignment;

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

Вы можете использовать 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;

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

Пример:

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

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

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

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

Если вы делаете резервную копию таблицы в Oracle Database. Попробуйте следующее утверждение.

CREATE TABLE name_table_bk
AS
SELECT *
  FROM name_table;

Я использую Oracle Database 12c.

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

CREATE TABLE assignment_20101120 AS SELECT * ИЗ присвоения;

Делает то же самое.

Другие вопросы по тегам