Insert através de select

Opa :smiley:

Faço um select em um banco linkado que eu tenho e gostaria de inserir os valores do select em um insert de outro banco:

select * from isbn.bancoscnpj@producao

insert into codigobanco (CODIGO, DESCRICAO) VALUES (SELECT hehe )

É possível fazer isso?

[]'s

INSERT INTO TB2 (CH_TB1, VALOR_TB2, NOME_TB2, DT_TB2, DESCRICAO_TB2) (SELECT CH_TB1, VALOR_TB1, NOME_TB1, DT_TB1, DESCRICAO_TB1 FROM TB1 WHERE CH_TB1 = @CH_TB1)

é isso que você precisa? :roll:

Flw!

Sim, mas isso funciona em bancos diferentes?

[]'s

É ANSI, qualquer banco que siga esse padrão funciona.

Opa

Deu certo

Valeu amigo :smiley:

[]'s

Oii …

Tenta executar o select e jogar tudo que ele retornar para um resultset … depois faz um while para percorrer todos os valores armazenados dentro desse resultset … e enfim … faz o insert em outra tabela !!

mais ou menos assim :

//adiciona uma query

// armazena os resultados dentro do resultset

ResultSet rset = pstmt.executeQuery();

// percorre o resultset
while(rset.next())
{

// insere os dados na outra tabela

}

:wink:

só mais uma maneira, eu, usando um banco oracle, faço isso assim:

BEGIN FOR V_FUNC IN (SELECT * FROM funcionarios WHERE salario < 500) -- aqui vc usa o select que quiser LOOP INSERT INTO estagiarios ( MATRICULA, NOME, ENDERECO, SALARIO ) VALUES ( V_FUNC.MATRICULA, V_FUNC.NOME, V_FUNC.ENDERECO, V_FUNC.SALARIO ) ; END LOOP; END;

claro, estou usando PL/SQL e portanto a logica acima so funciona em oracle. mas acredito que qualquer banco deve ter as funcoes de loop q sejam parecidas com o que fiz acima… mas, o INSERT INTO TABLE1 (A, B, C) VALUES (SELECT A, B, C FROM TABLE2); deve funcionar… so nao tenho certeza se deve-se usar o “values” ou não…

[quote=Pedro Felipe]só mais uma maneira, eu, usando um banco oracle, faço isso assim:
[/quote]

Por que fazer com muitas instruções (1 SELECT + N INSERT) quando se pode fazer apenas com uma única?

é q eu dei um exemplo muito simples, e nesse caso, realmente não precisava… vc pode usar uma instrução SQL padrão só:

INSERT
INTO estagiarios
(
MATRICULA,
NOME,
ENDERECO,
SALARIO
)
SELECT MATRICULA,
NOME,
ENDERECO,
SALARIO
FROM funcionarios
WHERE salario < 500
;

agora, quando as coisas começam a complicar, usar PL/SQL facilita a vida. digamos q a matricula dos estagiarios nao pudesse ser o mesmo numero de quando eles estavam na tabela de funcionarios, pois poderia esse numero ja estar em uso, e ele seja chave primaria. digamos q antes de inserir na tabela estagiarios eu quisesse descobrir uma matricula valida, então isso ajudaria:

DECLARE
V_MAT NUMBER(5, 0);
BEGIN
FOR V_FUNC IN
(SELECT * FROM funcionarios WHERE salario < 500) – aqui vc usa o select que quiser
LOOP
– primeiro faço uma lógica qualquer (exemplo, poderia ser algo mais complicado, aqui poderiamos ter varios “select into”)
SELECT MAX(MATRICULA) + 1
INTO V_MAT
FROM estagiarios;
– depois faço o insert, usando V_MAT
INSERT
INTO estagiarios
(
MATRICULA,
NOME,
ENDERECO,
SALARIO
)
VALUES
(
V_MAT,
V_FUNC.NOME,
V_FUNC.ENDERECO,
V_FUNC.SALARIO
)
;
END LOOP;
END;