Passando Objeto Java para Store Procedure - Oracle

3 respostas
marconato10

Olá pessoal,

Estou realizando um estudo de monografia e estou tendo dificuldade ao passar um objeto java para uma store procedure.

Este é meu objeto e a procedure no Oracle:

CREATE OR REPLACE TYPE TYP_SRGT_OBJ_TEAM_MEMBERS AS OBJECT(
firstName VARCHAR2 (20),
lastName VARCHAR2(20)
);

CREATE OR REPLACE   
procedure update_password(v_pass IN VARCHAR2,v_user IN varchar2, i_teamobject IN TYP_SRGT_OBJ_TEAM_MEMBERS) IS
BEGIN 
  ..................
  commit; 
END;

Classe java a passar para o Oracle:

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class TeamMembers implements SQLData {

	String sql_type = "TYP_SRGT_OBJ_TEAM_MEMBERS";

	private String firstName;
	private String lastName;
	
	public TeamMembers(String firstName, String lastName){
		this.firstName = firstName;
		this.lastName = lastName;
	}

	// gets and sets

	@Override
	public void readSQL(SQLInput stream, String typeName) throws SQLException {
		sql_type = typeName;
		firstName = stream.readString();
		lastName = stream.readString();
	}

	@Override
	public void writeSQL(SQLOutput stream) throws SQLException {
		stream.writeString(firstName);
		stream.writeString(lastName);
	}

	@Override
	public String getSQLTypeName() throws SQLException {
		return sql_type;
	}

}

Este é meu código Java que chama a procedure e tenta passar o objeto java TeamMembers:

Class.forName("oracle.jdbc.driver.OracleDriver");
		    String url = "jdbc:oracle:thin:@//192.168.0.120:1521/DBPLSQL";
		    
		    Connection conn = DriverManager.getConnection(url,"system","DBPLSQL");
		    
		    java.util.Map map = conn.getTypeMap();
     		    map.put("TYP_SRGT_OBJ_TEAM_MEMBERS",Class.forName("br.edu.utfpr.project.TeamMembers"));

		    //trying to pass to the database.
		    conn.setTypeMap(map);

		    TeamMembers team = new TeamMembers("Rodrigo", "Marconato");
                    Object o=(Object)team;
			
			//---------------------------------------------
			CallableStatement cstmt=conn.prepareCall("call update_password(?,?,?)");
			cstmt.setString(1,"10"); 
			cstmt.setString(2,"20");
			cstmt.setObject(3,o);
			cstmt.execute();

Quando eu tinha dois atributos na procedure, v_pass e v_user, a procedure era chamada com sucesso, mas agora com o terceiro parametro (Objeto Java), a seguinte exeção é lançada:

java.sql.SQLException: Non supported character set: oracle-character-set-178

at oracle.gss.util.NLSError.throwSQLException(NLSError.java:46)

at oracle.sql.CharacterSetUnknown.failCharsetUnknown(CharacterSetFactoryThin.java:171)

at oracle.sql.CharacterSetUnknown.convert(CharacterSetFactoryThin.java:135)

at oracle.sql.CHAR.(CHAR.java:159)

at oracle.sql.CHAR.(CHAR.java:183)

at oracle.jdbc.oracore.OracleTypeCHAR.toDatum(OracleTypeCHAR.java:161)

at oracle.sql.StructDescriptor.toOracleArray(StructDescriptor.java:830)

at oracle.sql.StructDescriptor.toArray(StructDescriptor.java:1735)

at oracle.sql.STRUCT.(STRUCT.java:136)

at oracle.sql.OracleSQLOutput.getSTRUCT(OracleSQLOutput.java:122)

at oracle.sql.STRUCT.toSTRUCT(STRUCT.java:620)

at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:2874)

at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:3015)

at br.edu.utfpr.oracleplsql.teste.TestePlsql.main(TestePlsql.java:55)

Será algum problema de Versão?
Estou usando windows XP, Oracle 10g e Java 1.6.0_26

3 Respostas

marconato10

Problema resolvido:
Versão do drive do oracle esta em desacordo com a versão do banco de dados. Ou seja, problema de character set era gerado através do drive incompatível
Fica a dica pra quem tiver o mesmo problema

drsmachado

marconato10:
Problema resolvido:
Versão do drive do oracle esta em desacordo com a versão do banco de dados. Ou seja, problema de character set era gerado através do drive incompatível
Fica a dica pra quem tiver o mesmo problema

Camarada, ótima postura informar o erro.
Por gentileza, complemente informando qual versão é a incorreta e qual a adequada.

marconato10

Olá Pessoal,

Vai depender da versão do Oracle que vocês estiverem usando, verifique qual a versão e procure saber qual é o drive compatível.
Não me lembro qual era a versão do meu drive, pois faz tempo que não mecho mais no projeto.

Criado 27 de junho de 2011
Ultima resposta 16 de set. de 2011
Respostas 3
Participantes 2