SELECT INTO usando Oracle


134

Estou tentando fazer um SELECT INTO usando Oracle. Minha consulta é:

SELECT * INTO new_table FROM old_table;

Mas eu recebo o seguinte erro:

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

Alguma idéia do que está errado?


O comportamento padrão do exposto acima deve ser o que eu pensava originalmente: No entanto, a Oracle o implementou de maneira totalmente diferente em seu próprio dialeto do SQL Oracle Docs on Insert ...


3
select intocriar uma nova tabela não faz parte do padrão. O padrão SQL para criar uma tabela com base em uma seleção é create table .. as select .... No padrão SQL, SELECT INTOestá definido para ler um valor da coluna em uma variável em uma linguagem de programação
a_horse_with_no_name

Respostas:


282

Se NEW_TABLE já existir, então ...

insert into new_table 
select * from old_table
/

Se você deseja criar NEW_TABLE com base nos registros em OLD_TABLE ...

create table new_table as 
select * from old_table
/

Se o objetivo é criar uma tabela nova, mas vazia, use uma cláusula WHERE com uma condição que nunca pode ser verdadeira:

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

Lembre-se de que CREATE TABLE ... AS SELECT cria apenas uma tabela com a mesma projeção que a tabela de origem. A nova tabela não possui restrições, gatilhos ou índices que a tabela original possa ter. Esses ainda precisam ser adicionados manualmente (se necessário).


18
+1 @Robert: Além disso, se você quiser apenas copiar o esquema da tabela antiga, use uma cláusula where negativa, como por exemplo: crie nova tabela como selecione * da tabela antiga WHERE 1 = 2.
KMån

31

select intoé usado em pl / sql para definir uma variável para os valores do campo. Em vez disso, use

create table new_table as select * from old_table

Eu acho que SELECT INTO fazia parte do padrão. A Oracle fez algo estranho aqui ou nunca fez parte do padrão?
Robert Gould

3
select intofaz parte de pl / sql. É uma linguagem para escrever procedimentos armazenados e não tem relação direta com o padrão sql. E sim, a Oracle fez muitas coisas que nunca foram parte das = padrão)
Rorick

2
@RobertGould: não, nãoSELECT INTO é SQL padrão. O padrão apenas definecreate table .. as select ..
a_horse_with_no_name

SELECIONE DENTRO É parte do SQL padrão, consulte w3schools.com/sql/sql_select_into.asp Como muitas outras partes do SQL padrão, o Oracle faz suas próprias coisas.
Graham Hanson

2
@grahamhanson que parece ser um link para o site de tutoriais do W3Schools, não um documento de normas ANSI.
William Robertson

3

Usar:

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

Exemplo:

create table dept
as
select empno, ename from emp;

Se a tabela já existir:

insert into new_tablename select columns_list from Existed_table;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.