2008-11-20 1 views
15

Excuting линию SQL:Oracle ошибка: ORA-00905: недостающее ключевое слово

SELECT * 
    INTO assignment_20081120 
    FROM assignment ; 

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

+0

Для тех, кто нашел это в результате поиска Google, как это сделал я, но не единственная причина, по которой это произошло, я получил эту ошибку, когда объявил переменную без указания ее типа. – vapcguy 2016-08-22 17:23:06

ответ

18

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

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

CREATE TABLE assignment_20081120 
AS 
SELECT * 
    FROM assignment 
3

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

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

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

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

INSERT INTO assignment_20081120 SELECT * FROM assignment; 

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

+4

Объяснение просто состоит в том, что `SELECT..INTO` является * PL/SQL * синтаксисом, а не SQL - он ожидает, что переменная PL/SQL примет результат запроса. – 2012-03-29 07:41:20

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; 
0

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

CREATE TABLE assign_20101120 AS SELECT * FROM назначение;

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

+7

Вот что сказал Джастин Кейв почти два года назад ... – 2010-11-10 14:51:56

0

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

Пример:

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

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

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

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