Ошибка Oracle: ORA-00905: отсутствует ключевое слово - PullRequest
17 голосов
/ 20 ноября 2008

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

SELECT * 
  INTO assignment_20081120 
  FROM assignment ;

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

Ответы [ 5 ]

19 голосов
/ 20 ноября 2008

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

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

CREATE TABLE assignment_20081120
AS
SELECT *
  FROM assignment
6 голосов
/ 28 сентября 2009

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

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

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

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

INSERT INTO assignment_20081120 SELECT * FROM assignment;

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

3 голосов
/ 28 сентября 2009

Вы можете использовать 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;
0 голосов
/ 10 октября 2017

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

Пример:

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

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

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

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

0 голосов
/ 10 ноября 2010

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

CREATE TABLE.

То же самое.

...