PreparedStatement inner join- duvida [RESOLVIDO]

15 respostas
R

Pessoal como que eu faço uma consulta com 2 banco de dados diferente em servidores diferentes (os 2 sao sqlserver)

SELECT b.nome, p.idpontuacao FROM GETI02.testando.dbo.prova p inner join SQLSERVER.corporerm.dbo.pfunc b on p.idfunc = b.chapa

public static Connection getConnection() {}
public static Connection getConnectionRM() {}

Obrigado :smiley:

15 Respostas

R

ninguem sabe reponder???

A

vc ja testou no banco?

S

Desculpa, mais não entendi você quer efetuar um select em dois bancos ao mesmo tempo ?

A

se nao funciona assim…conecta no catalogo e dela vc acessa oq vc quiser…:wink:

P

Ouvi dizer que no Oracle é possível executar uma query para diferentes bancos, através de um Database Link.

Agora, acho melhor você ter dois Connections, obter os resultados de cada banco de dados e trata-los de forma separada.

B

Coloca o nome do banco de dados antes do nome da tabela, por exemplo:

SELECT     
        b.nome, p.idpontuacao  
    FROM       
        testando..prova p 
    inner join corporerm..pfunc b on
        p.idfunc = b.chapa

Agora, se o banco de dados estiver em outro servidor, você precisa configurar o linked server que esta dentro da pasta security na raiz do Enterprise Manager.


Abs,

Bruno Tafarelo

J

Eu trabalho com Oralce, e sim, no Oralce é possível. Basta ter um Database Link.
já me falaram que no SQL Server também da pra fazer algo similar, só não sei como… hehehe =)
mas dá uma olhada nesses dois links…
http://msdn.microsoft.com/en-us/library/ms188279.aspx
http://www.devmedia.com.br/articles/viewcomp.asp?comp=2748&hl=

:slight_smile:

B

Desculpem,

Esqueci de perguntar qual era o banco de dados.

Do jeito que falei, é SQL Server 2000.

R

É sim, é SQLSERVER…

Mas o problema que quero resolver, é saber como que faço para fazer inner join em banco de dados diferentes usando a linguagem JAVA… :smiley:

B

Rogrido,

Se for entre dois banco de dados no mesmo servidor, não precisa fazer basicamente nada, basta colocar o nome do banco de dados antes do nome da tabela:

banco..tabela

Nem precisa colocar o nome do usuário. A unica diferença na Query é essa, depois é executada dentro de uma Connection só, normalmente.

R
Nem precisa colocar o nome do usuário. A unica diferença na Query é essa, depois é executada dentro de uma Connection só, normalmente.
btafarelo, pelo que eu sei, na string de conexao, tem que passar o nome do banco de dados, certo? Como os nome são diferentes, tem que ter conexoes diferentes, nao é????
public static Connection getConnection() {



        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
      conn = DriverManager.getConnection("jdbc:jtds:sqlserver://10.0.1.96:1433;DatabaseName=testando;User=sistema;Password=sistema");
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }

        return conn;

    }
public static Connection getConnectionRM() {



        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
      conn = DriverManager.getConnection("jdbc:jtds:sqlserver://10.0.1.96:1433;DatabaseName=corporerm;User=sa;Password=senhamt");
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }

        return conn;

    }
B

Rodrigo,

Como fazia tempo que eu não usava isso, fiz um teste antes de responder, e não precisa, veja meu código abaixo:

package teste;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Main {

	public static void main(String[] args) {
		try {
			Class.forName("net.sourceforge.jtds.jdbc.Driver");
			
			Connection cnn = DriverManager.getConnection("jdbc:jtds:sqlserver://server:1433/banco1");
			Statement stmt = cnn.createStatement();
			ResultSet rs = stmt.executeQuery("SELECT * FROM banco1..SOLICITACOES S INNER JOIN NORTHWIND..CATEGORIES C ON S.id = C.CATEGORYID");
			
			while (rs.next())
				System.out.println(rs.getString(2));
			
			rs.close();
			stmt.close();
			cnn.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

Não precisa de conexões diferentes, pois que processa a Query é o SQL Server e não o JAVA, é como se você estive executando a Query no QueryAnalizer, é um recurso do Server.

R

Velho… vou testar agooora isso… depois respondo aqui para a comunidade…

Grato

T+

R

tafarelo, cara voce salvou o dia ! finalmente coloquei para funcionar o relatorio! pois eu nao estava conseguindo fazer esse relatorio no IREPORT de jeito nenhum.

Para os gujeseiros de plantao, a solução para gerar relatorios em 2 banco de dados diferentes é usar a seguinte estrutura no sql (sqlserver):

nomedobanco.proprietario.tabela.campo

Exemplo:

sysaval.dbo.funcionario.nome

segue o codigo:

SELECT pfunc.nome, sum(pontuacao.valorpontuacao) as pontuacao FROM CORPORERM.dbo.PFUNC PFUNC inner join bdavalfunc.dbo.prova prova on prova.idfunc = pfunc.chapa inner join bdavalfunc.dbo.pontuacao pontuacao on prova.idpontuacao = pontuacao.idpontuacao WHERE (prova.ano = $P{ANO}) group by PFUNC.chapa, PFUNC.nome order by pontuacao desc

Só tive uma dúvida, e se utilizarmos os 2 banco de dados em 2 servidores diferentes? Qual é a solução? teria que passar o ip na consulta?

T+

J

coloca o seguinte pro SQL Server

servidor.banco.dbo.tabela

Criado 9 de janeiro de 2009
Ultima resposta 11 de jan. de 2010
Respostas 15
Participantes 7