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