Eu tenho um procedimento armazenado do SQL Server em que estou criando uma tabela usando outra tabela.
Select Distinct
col1
,col2
,col3
,col4
into table_2
from table_1;
A instrução acima criará uma nova tabela como 'table_2' com a lista de colunas selecionada.
Tentei converter a consulta acima na sintaxe do Oracle:
Create table table_2 as
select
col1
,col2
,col3
,col4
from table_1;
Isso está funcionando bem como esperado quando estou executando no editor. No entanto, a mesma instrução está me dando erros quando estou tentando usar isso no Oracle Procedure.
Já passei por alguns links ou algo assim, que diz que precisa criar algumas variáveis temporárias ou armazenamento ou loop para realizar a mesma tarefa.
Estou ficando muito confuso agora e não sei como converter essa instrução simples em sintaxe válida do Oracle.
Se você quiser criar uma tabela (ou fazer qualquer outro DDL) em um procedimento armazenado, precisará usar SQL dinâmico
No entanto, se você criar a tabela dinamicamente, também precisará usar SQL dinâmico toda vez que quiser consultar a tabela posteriormente. Isso geralmente torna seu código muito mais difícil de construir e testar. E você não poderá ter duas sessões executando o procedimento ao mesmo tempo, pois suas
create table
instruções entrariam em conflito entre si.Dando um passo atrás, no SQL Server, é muito comum criar tabelas temporárias locais dentro de procedimentos. É muito, muito raro fazer isso no Oracle. Raramente faz sentido tentar portar a lógica do SQL Server para o Oracle (ou vice-versa) diretamente assim. Se você fizer isso, você descobrirá que o Oracle é péssimo para executar o código do SQL Server (e o SQL Server é péssimo para executar o código do Oracle). Geralmente, você deseja obter a lógica do SQL Server e descobrir a melhor maneira de implementar essa lógica no Oracle.
O Oracle possui tabelas temporárias globais em que a definição da tabela é global, mas os dados são locais para sua sessão (ou transação). Potencialmente, você quer fazer
e, em seguida, insira nessa tabela em seu procedimento armazenado em vez de tentar criar a tabela dinamicamente.