SELECCIONE CON Oracle

134

Estoy tratando de hacer un SELECT INTO usando Oracle. Mi consulta es:

SELECT * INTO new_table FROM old_table;

Pero me sale el siguiente error:

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

Alguna idea de lo que está mal?


El comportamiento estándar de lo anterior debería ser como pensaba originalmente: sin embargo, Oracle lo implementó de manera totalmente diferente en su propio dialecto de SQL Oracle Docs en Insertar ... Seleccione

Robert Gould
fuente
3
select intocrear una nueva tabla no es parte del estándar. El estándar SQL para crear una tabla basada en una selección es create table .. as select .... En el estándar SQL SELECT INTOse define para leer un valor de columna en una variable en un lenguaje de programación
a_horse_with_no_name

Respuestas:

282

Si NEW_TABLE ya existe, entonces ...

insert into new_table 
select * from old_table
/

Si desea crear NEW_TABLE en función de los registros en OLD_TABLE ...

create table new_table as 
select * from old_table
/

Si el propósito es crear una tabla nueva pero vacía, utilice una cláusula WHERE con una condición que nunca puede ser cierta:

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

Recuerde que CREATE TABLE ... AS SELECT crea solo una tabla con la misma proyección que la tabla fuente. La nueva tabla no tiene restricciones, desencadenantes o índices que pueda tener la tabla original. Esos aún deben agregarse manualmente (si son necesarios).

APC
fuente
18
+1 @Robert: Además, si solo quieres copiar el esquema de old_table, usa una cláusula where negativa, como por ejemplo: create new_table como select * from old_table WHERE 1 = 2.
KMån
31

select intose usa en pl / sql para establecer una variable en valores de campo. En cambio, use

create table new_table as select * from old_table
wallyk
fuente
Pensé que SELECT INTO era parte de la Norma. ¿Oracle hizo algo extraño aquí o nunca fue parte del estándar?
Robert Gould
3
select intoes parte de pl / sql. Es un lenguaje para escribir procedimientos almacenados y no tiene relación directa con el estándar SQL. Y sí, Oracle hizo muchas cosas que nunca fueron parte del estándar =)
Rorick
2
@RobertGould: no, noSELECT INTO es SQL estándar. El estándar solo definecreate table .. as select ..
a_horse_with_no_name
SELECCIONAR EN ES parte del SQL estándar, consulte w3schools.com/sql/sql_select_into.asp Al igual que muchas otras partes del SQL estándar, Oracle hace lo suyo.
Graham Hanson
2
@grahamhanson que parece ser un enlace al sitio tutorial de W3Schools, no un documento de estándares ANSI.
William Robertson
3

Utilizar:

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

Ejemplo:

create table dept
as
select empno, ename from emp;

Si la tabla ya existe:

insert into new_tablename select columns_list from Existed_table;
PRADEEP R
fuente