Erro ao chamar uma FUNCTION do Oracle através do JDBC

6 respostas
R

Olá!!

Gente,

Criei um método que chama um método java para chamar uma FUNCTION do Oracle. No momento da execução o erro ORA-01745: nome de variável de host/ligação inválido é gerado. Alguém já passou por isso :?:

Para facilitar, segue o código.

public static String abrirOS( String codfil, String codcen, String codapl, String obs, String maqpar)throws Exception {

		ResultSet rs = null;
		Connection conn = SqlConnection.getInstance().getConnection();
	
		CallableStatement stmt  = null;

		String result = "";
		/**/
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");   
		java.sql.Date data_formatada = new java.sql.Date(format.parse(maqpar).getTime());
		/**/
		
		try {			
			String call = "CALL ? := ABRIR_OS(?, ?, ?, ?, ?)";
			stmt = conn.prepareCall(call);              
			stmt.registerOutParameter(1, OracleTypes.VARCHAR);
			stmt.setString(2,codfil);
			stmt.setString(3,codcen);
			stmt.setString(4,codapl);
			stmt.setString(5,obs);
			stmt.setDate(6, data_formatada);			  
			stmt.execute();   
			rs = (ResultSet) stmt.getObject(1);

			if(rs != null){
				while (rs.next()) {		
					result = rs.getString(1);
					System.out.println(result);
				}	
			} else {
				result = "Erro: ABRIR_OS";
				System.out.println(result);
			}			
			rs.close();
		} catch (Exception e) {
			throw e;
		} finally {
			if (stmt != null) {
				stmt.close();
			}
			SqlConnection.getInstance().closeConnection(conn);
		}
		return result;		
	}

6 Respostas

T

Será que você não teria de fazer algo como:

SELECT ABRIR_OS(?, ?, ?, ?, ?) FROM DUAL;
J

thingol:
Será que você não teria de fazer algo como:

SELECT ABRIR_OS(?, ?, ?, ?, ?) FROM DUAL;

a chamada esta correta, pelo menos a sintaxe.
de acordo com a documentação:

ORA-01745:	invalid host/bind variable name
Cause:	A colon in a bind variable or INTO specification was followed by an inappropriate name, perhaps a reserved word.
Action:	Change the variable name and retry the operation.

verifique os valores que vc esta passando como parametros.

[]´s

R

Gente,

Revi todos os parâmetros. Não há nada de estranho neles, são todos do tipo String.
Toda a chamada estar de acordo com a documentação.
Testei a função no Oracle[color=darkred]deu certo!!![/color]
Mas na hora de chamar pelo java…

Ainda não descobri o que estar errado… HELP!! :cry:

V

Voce diz que todos os parametros sao do tipo String..
o teu paramentro nto 6 vc passa como Date..

sera talvel algum problema com a chamada da sua funcao??
olhe como eu chamo

try{
            String query = "begin ? := GETDATE(); end;";
            CallableStatement pstmt = conexao.prepareCall(query);
            pstmt.registerOutParameter(1, Types.DATE);
            pstmt.executeUpdate();
            pstmt.close();
            conec.close();
                
            String formato = "dd/MM/yyyy";                
            SimpleDateFormat sdf = new SimpleDateFormat(formato);   
            Date hoje = pstmt.getDate(1);                
                
            return  sdf.format(hoje);
        }
        catch(Exception e)
        {  
            e.printStackTrace();
        }
R

Tem razão vitorpatriarcha ! Falha minha! :?

O parâmetro [color=darkred]6[/color] é Date sim!! tanto neste método como na function.

stmt.setDate(6,maqpar);

O que vocês sugerem? :?:
Que eu modifique a function para receber String e não Date? :?:

R

Agradeço imensamente a todos os que tiveram paciência de ler/ responder a este post! :wink:

As mubanças foram: a chamada modificada da function e o ResultSet foi retirado. Agora o retorno vai direto do CallableStatement para a variável [color=darkblue]result[/color].

Abaixo está o código final. (Que funciona 8))

public static String abrirOS( int codfil, int codcen, int codapl, String obs, Date maqpar)throws Exception {
		
		Connection conn = SqlConnection.getInstance().getConnection();	
		CallableStatement stmt  = null;
		String result = "";		
		
		try {
			
			String call = "BEGIN ? := ABRIR_OS(?, ?, ?, ?, ?); END;";
			stmt = conn.prepareCall(call);              
			stmt.registerOutParameter(1, OracleTypes.VARCHAR);
			stmt.setInt(2,codfil);
			stmt.setInt(3,codcen);
			stmt.setInt(4,codapl);
			stmt.setString(5,obs);
			stmt.setDate(6,maqpar);			  
			stmt.execute();   
			
			result = stmt.getString(1);
		
		} catch (Exception e) {
			throw e;
		} finally {
			if (stmt != null) {
				stmt.close();
			}
			SqlConnection.getInstance().closeConnection(conn);
		}
		return result==null?"ERRO - Erro ao Abrir OS":result;		
	}
Criado 4 de setembro de 2008
Ultima resposta 5 de set. de 2008
Respostas 6
Participantes 4