Pergunta

Eu estou escrevendo SQL (para Oracle) como:

INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;

onde Schema1.tableA e Schema2.tableA têm as mesmas colunas. No entanto, parece que isso não é seguro, uma vez que a ordem das colunas voltando no SELECT é indefinido. O que eu deveria estar fazendo é:

INSERT INTO Schema1.tableA (col1, col2, ... colN) 
SELECT (col1, col2, ... colN) FROM Schema2.tableA;

Estou fazendo isso para os lotes de tabelas usando alguns scripts, então o que eu gostaria de fazer é escrever algo como:

INSERT INTO Schema1.tableA (foo(Schema1.tableA)) 
SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;

Onde foo é um pouco de magia bacana que os extratos os nomes das colunas de uma tabela e pacotes-los na sintaxe apropriada. Pensamentos?

Foi útil?

Solução

Este PL / SQL deve fazê-lo:

declare
    l_cols long;
    l_sql  long;
begin
    for r in (select column_name from all_tab_columns
              where  table_name = 'TABLEA'
              and    owner = 'SCHEMA1'
             )
    loop
       l_cols := l_cols || ',' || r.column_name;
    end loop;

    -- Remove leading comma
    l_cols := substr(l_cols, 2);

    l_sql := 'insert into schema1.tableA (' || l_cols || ') select ' 
             || l_cols || ' from schema2.tableA';

    execute immediate l_sql;

end;
/

Outras dicas

Você pode precisar para construir as instruções de inserção dinamicamente usando USER_TAB_COLUMNS e executá-los usando EXECUTAR IMEDIATA .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top