Problema com SQL do Oracle no Java

Pessoal, acho que resolvi em partes o problema.

Vocês perceberam pelo SQL que minhas consultas alternavam entre duas bases, uma chamada “PRODUCAO” e outra chamada “SJBV”?

Pois é, ele sempre dá erro no nome das colunas que são referentes a base “SJBV”. Removendo elas consigo executar numa boa.

A dúvida agora é, como montar uma conexão que acesse simultaneamente as duas bases.
Na minha Factory eu somente estou ativando o user e senha da base PRODUCAO, sendo que também preciso conectar em SJBV.

E agora??

Hum! Pois é.

Tenta fazer o seguinte, acredito que seja o caso de permissão, sendo assim, neste teu select, usando no java talvez você precise especificar o usuario.
Assim, você disse que consulta o banco PRODUÇÃO e SJBV. Então, como você já está conectado ao banco PRODUÇÃO nas tabelas pertencentes ao SJBV você digita também o nome do usuario. Exemplo:

Usuario da SJBV:

Herick. Sua consulta.

Herick.nome_da_tabela.nome_da_coluna.

Tente neste formato ok?
Abraços.

Quase certo que o problema é permissão.

Faz o seguinte, utilize o mesmo usuário que você usou para conectar diretamente no Oracle, através deo SQL*Plus ou outro Client.
Caso não seja possível utilizar esse usuário, crie um Synonim para utilizar a tabela no outro usuário sem especificar o OWNER.

Ex:
create or replace public synonym NOME_DO_SINONIMO_IGUAL_DA_TABELA
for usuário.tabela;

Eu verifiquei também, que você chama essa function do Oracle na Query:

sjbv.pck_sjbv_endereco.Pega_EnderecoRefCobr

Verique as permissões dela, verifique quais tabelas essa função utiliza, conceda as permissões necessárias e crie os synonyms tb.

Por último, verifique a versão do Client Oracle que está na maquina que está rodando a aplicação que desenvolveu, e compare com a versão que utiliza na máquina que conectou diretamente (Caso sejam máquinas diferentes, claro).

Vale também conferir o IP do Servidor no TNSnames das duas máquinas. Será que não estão acessando bases diferentes?

Verifique em

c:[ORACLEHOME]\NETWORK\ADMIN\tnsnames.ora

Bom, deve ser alguma coisa dessas, eu li que o pessoa falou de colocar “as” antes do Alias. Mas não tem nada a ver, você pode verificar que mesmo a Oracle não utiliza essa sintaxe em seus treinamentos, ela não segue o Padrão SQLANSI.

Abs

[quote=nel]Hum! Pois é.

Tenta fazer o seguinte, acredito que seja o caso de permissão, sendo assim, neste teu select, usando no java talvez você precise especificar o usuario.
Assim, você disse que consulta o banco PRODUÇÃO e SJBV. Então, como você já está conectado ao banco PRODUÇÃO nas tabelas pertencentes ao SJBV você digita também o nome do usuario. Exemplo:

Usuario da SJBV:

Herick. Sua consulta.

Herick.nome_da_tabela.nome_da_coluna.

Tente neste formato ok?
Abraços.[/quote]

Talvez eu tenha me expressado mal.

Isso já está sendo feito. Note que em alguns locais está PRODUCAO.alguma_coisa e outras são SJBV.alguma_coisa.
Mesmo especificando o usuário que no caso são dois ele não consegue conectar nas tabelas do usuário SJBV.

No meu DriverManager, estou passando o host, o usuário “producao” e a senha dele.
Creio que não é possível passar dois usuários e instanciar uma única conexão.

Agora que vi que já tinha conseguido rodar.
Você conecta com um usuário, e usa o Owner antes dos objetos que precisar acessar de outro usuário.
Ou cria sinônimos.

[quote=fabiomazzo]Agora que vi que já tinha conseguido rodar.
Você conecta com um usuário, e usa o Owner antes dos objetos que precisar acessar de outro usuário.
Ou cria sinônimos.[/quote]

Valew cara, vou tentar aqui as dicas que vc me passou.
Eu estava começando a responder o seu post anterior…rsrs. Mas então, o banco está em um único servidor, olhei no arquivo de configuração e está tudo ok.

Quando entro no PL/SQL, preciso escolher com qual usuário logar, entrando tanto com o usuário Producao ou com o usuário SJBV eu consigo rodar esse SQL inteiro sem problemas.
No sistema em desenvolvimento eu estou conectando com o Producao e dá os erros descritos nos tópicos anteriores.

Vou ver o esquema de Owner que vc me passou. Thank’s!

Caras, fiz uma coisa aqui e consegui resolver o problema.
Analisei todo o SQL e descobri qual a coluna onde dá o erro no java.
Não consegui entender o motivo, mas um campo que está perfeitamente ok na base de dados, nome correto, tudo bonitinho, simplesmente não funciona.

É incrível mesmo, seu eu copio e colo no PL/SQL vai numa boa, em java dá o erro que estou reclamando desde o início. A questão de permissão do usuário eu até pensei que poderia ser mesmo, mas quando testei havia removido todas as chamadas do usuário SJBV e com isso removi a chamada do campo problemático, só analisando um por um que funcionou.

O campo é “RT.TXMENSAGEM_DOC_FISCAL” da tabela “SJBV.REGRA_TRIBUTACAO RT”.
Sem ele, todo o SQL funciona perfeitinho.

Não sei nem se vou querer tentar entender o motivo disso, mas qqr avanço eu posto aqui.

Aproveito pra agradecer mais uma vez todo o pessoal que respondeu, ajudou, indicou caminhos e tudo o mais.
Obrigadão mesmo!!!
:wink:

É isso ai cara.

Nada como perseverença para se acalcançar resultados. Boa sorte!
Qualquer coisa poste novamente que o pessoal do GUJ é bem atencioso.

Abraços.

Bom, voltei com outro problema agora.

Eu preciso do conteúdo do campo que misteriosamente dá problema, mas já sei como posso recuperar o valor dele, porém, deu outro problema estranhíssimo. Meu resultSet não traz nada.

Não dá erro, não dá exceção na consulta, porém, não consigo pegar nenhum valor do ResultSet.
A mesma consulta feita no PL/SQL me retorna os dados.

Debuguei e não encontrei nada que pudesse me dar uma luz.

Eu tô zicado… :x

Edit:

O código está assim:

[code]try {
Connection conn = new ConnectionFactory().getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);

		ResultSet rs = stmt.executeQuery();
					
		while (rs.next()) {
			System.out.println("---while--- ");
		}
		stmt.close();
		try {
			conn.close();
		} catch (SQLException ex) {
			Logger.getLogger(ConsultaBoleto.class.getName()).log(Level.SEVERE, null, ex);
		}
	} catch (SQLException ex) {
		Logger.getLogger(ConsultaBoleto.class.getName()).log(Level.SEVERE, null, ex);
	}[/code]

A string “sql” do PreparedStatement é a consulta gigantesca que agora retorna sem erros. Porém, ele sequer entra no while. Já tentei pegar os campos pelo próprio resultSet, mas não vem nada.