SELECT INTO à l'aide d'Oracle

135

J'essaye de faire un SELECT INTO en utilisant Oracle. Ma requête est:

SELECT * INTO new_table FROM old_table;

Mais j'obtiens l'erreur suivante:

SQL Error: ORA-00905: missing keyword
00905. 00000 -  "missing keyword"

Des idées ce qui ne va pas?


Le comportement standard de ce qui précède devrait être comme je le pensais à l'origine: Cependant, Oracle l'a implémenté totalement différemment dans son propre dialecte de SQL Oracle Docs lors de l'insertion ... Sélectionnez

Robert Gould
la source
3
select intocréer une nouvelle table ne fait pas partie de la norme. La norme SQL pour créer une table basée sur une sélection est create table .. as select .... Dans la norme SQL, il SELECT INTOest défini de lire une valeur de colonne dans une variable dans un langage de programmation
a_horse_with_no_name

Réponses:

283

Si NEW_TABLE existe déjà, alors ...

insert into new_table 
select * from old_table
/

Si vous souhaitez créer NEW_TABLE en fonction des enregistrements dans OLD_TABLE ...

create table new_table as 
select * from old_table
/

Si le but est de créer une table nouvelle mais vide, utilisez une clause WHERE avec une condition qui ne peut jamais être vraie:

create table new_table as 
select * from old_table
where 1 = 2
/

N'oubliez pas que CREATE TABLE ... AS SELECT crée uniquement une table avec la même projection que la table source. La nouvelle table n'a pas de contraintes, déclencheurs ou index que la table d'origine pourrait avoir. Ceux-ci doivent encore être ajoutés manuellement (s'ils sont requis).

APC
la source
18
+1 @Robert: De plus, si vous voulez simplement copier le schéma de old_table, utilisez une clause where négative, comme par exemple: create new_table as select * from old_table WHERE 1 = 2.
KMån
31

select intoest utilisé dans pl / sql pour définir une variable sur des valeurs de champ. Au lieu de cela, utilisez

create table new_table as select * from old_table
marcher
la source
Je pensais que SELECT INTO faisait partie de la norme. Oracle a-t-il fait quelque chose d'étrange ici ou n'a-t-il jamais fait partie de la norme?
Robert Gould
3
select intofait partie de pl / sql. C'est un langage pour écrire des procédures stockées et n'a aucune relation directe avec le standard SQL. Et oui, Oracle a fait beaucoup de choses qui n'ont jamais fait partie de la norme =)
Rorick
2
@RobertGould: non, ce SELECT INTO n'est pas du SQL standard. La norme définit uniquementcreate table .. as select ..
a_horse_with_no_name
SELECT INTO EST une partie du SQL standard voir w3schools.com/sql/sql_select_into.asp Comme beaucoup d'autres parties du SQL standard, Oracle fait ses propres choses.
graham hanson
2
@grahamhanson qui semble être un lien vers le site du didacticiel W3Schools, pas un document de normes ANSI.
William Robertson
3

Utilisation:

create table new_table_name 
as
select column_name,[more columns] from Existed_table;

Exemple:

create table dept
as
select empno, ename from emp;

Si la table existe déjà:

insert into new_tablename select columns_list from Existed_table;
PRADEEP R
la source