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.
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
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'instructionSELECT...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!
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;
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.
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.