web-dev-qa-db-fra.com

Erreur Oracle: ORA-00905: Mot clé manquant.

Exécuter la ligne de SQL:

SELECT * 
  INTO assignment_20081120 
  FROM assignment ;

contre une base de données Oracle pour sauvegarder une table appelée affectation me donne l'erreur Oracle suivante: ORA-00905: Mot clé manquant.

17
test

Sauf s'il existe une seule ligne dans la table ASSIGNMENT et que ASSIGNMENT_20081120 est une variable locale PL/SQL de type ASSIGNMENT%ROWTYPE, ce n'est pas ce que vous voulez.

En supposant que vous essayez de créer une nouvelle table et de copier les données existantes dans cette nouvelle table

CREATE TABLE assignment_20081120
AS
SELECT *
  FROM assignment
19
Justin Cave

D'abord, j'ai pensé:

"... Dans Microsoft SQL Server, le SELECT...INTO crée automatiquement La nouvelle table alors qu'Oracle semble Vous demander de le créer manuellement Avant d'exécuter l'instruction SELECT...INTO.."

Mais après avoir généré manuellement une table, cela ne fonctionnait toujours pas, affichant toujours l'erreur "mot clé manquant".

J'ai donc abandonné ce temps et l'ai résolu en créant d'abord manuellement la table, puis en utilisant l'instruction "classique" SELECT:

INSERT INTO assignment_20081120 SELECT * FROM assignment;

Ce qui a fonctionné comme prévu. Si quelqu'un vous expliquait comment utiliser correctement le SELECT...INTO, je serais heureux!

5
Uwe Keim

Vous pouvez utiliser select dans un bloc PLSQL tel que ci-dessous.

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;

Ce code ne fonctionnera que s'il y a exactement 1 ligne dans l'affectation. Habituellement, vous utiliserez ce type de code pour sélectionner une ligne spécifique identifiée par un numéro de clé.

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;
3
Rene

Bien que cela ne soit pas directement lié à la question exacte du PO, je viens de découvrir que l'utilisation d'un mot réservé Oracle dans votre requête (dans mon cas, l'alias IN) peut provoquer la même erreur. 

Exemple:

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

Ou si son dans la requête elle-même comme un nom de champ

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

Cela jetterait également cette erreur. J'espère que ça aidera quelqu'un. 

0
logixologist

Réponse tardive, mais je viens juste de figurer sur cette liste aujourd'hui!

CREATE TABLE affectation_20101120 AS SELECT * affectation;

Fait la même chose.

0
David