Ibatis TypeHandler 和存储过程中类型中的空 Varchar 参数
Ibatis TypeHandler and empty Varchar parameters in types in stored procedure
在 mybatis 中,spring 应用程序我有一个 TypeHandler,它为调用 Oracle 存储过程所需的结构数组填充数据。 blob 条目已正确填充并在存储过程中可见;字符串条目不是,不会发送任何字符串数据。日志中没有打印错误或警告。数据在应用程序中不为空且有效。数据在应用程序和 oracle 之间消失了。
我的处理程序的 setParameter
实现如下所示:
public void setParameter(PreparedStatement ps, int i, List<MailAttachment> parameter,
JdbcType jdbcType) throws SQLException
{
List<MailAttachment> attachmentList = parameter;
OracleConnection oracleConnection = ps.getConnection().unwrap(OracleConnection.class);
StructDescriptor structDescriptor = StructDescriptor.createDescriptor(ATTACHMENT, oracleConnection);
Object[] structs = null;
structs = new Object[attachmentList == null ? 0 :attachmentList.size()];
if (attachmentList != null) {
//CharacterSet chs = CharacterSet.make(CharacterSet.UTF8_CHARSET);
for (int index = 0; index < attachmentList.size(); index++) {
MailAttachment mailAttachment = attachmentList.get(index);
BLOB blob = null;
if (mailAttachment.getData() != null){
blob = BLOB.createTemporary(oracleConnection,false,BLOB.DURATION_SESSION);
// filling blob works
}
CHAR attachName = new CHAR(mailAttachment.getFilename(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );
CHAR contentType = new CHAR(mailAttachment.getContentType(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );
STRUCT struct = new STRUCT(structDescriptor, oracleConnection,
new Object[] {blob, attachName, contentType, null}
);
structs[index] = struct;
}
}
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(ATTACHMENT_LIST, oracleConnection);
ARRAY oracleArray = new ARRAY(arrayDesc, oracleConnection, structs);
ps.setObject(i, oracleArray);
}
此问题与 Oracle JDBC 驱动程序有关,它支持国际化。
请记住将 orai18n.jar 包含在 classpath/pom 文件中,并为您的 ojdbc jar 文件提供正确的版本。
如果缺少 orai18n.jar:
- setParameters: Oracle 类型中的 varchar2 参数将设置为 null
- getResult/getNonNullParameter: varchar2 参数将加载到 java class 作为“???”字符串。
在 mybatis 中,spring 应用程序我有一个 TypeHandler,它为调用 Oracle 存储过程所需的结构数组填充数据。 blob 条目已正确填充并在存储过程中可见;字符串条目不是,不会发送任何字符串数据。日志中没有打印错误或警告。数据在应用程序中不为空且有效。数据在应用程序和 oracle 之间消失了。
我的处理程序的 setParameter
实现如下所示:
public void setParameter(PreparedStatement ps, int i, List<MailAttachment> parameter,
JdbcType jdbcType) throws SQLException
{
List<MailAttachment> attachmentList = parameter;
OracleConnection oracleConnection = ps.getConnection().unwrap(OracleConnection.class);
StructDescriptor structDescriptor = StructDescriptor.createDescriptor(ATTACHMENT, oracleConnection);
Object[] structs = null;
structs = new Object[attachmentList == null ? 0 :attachmentList.size()];
if (attachmentList != null) {
//CharacterSet chs = CharacterSet.make(CharacterSet.UTF8_CHARSET);
for (int index = 0; index < attachmentList.size(); index++) {
MailAttachment mailAttachment = attachmentList.get(index);
BLOB blob = null;
if (mailAttachment.getData() != null){
blob = BLOB.createTemporary(oracleConnection,false,BLOB.DURATION_SESSION);
// filling blob works
}
CHAR attachName = new CHAR(mailAttachment.getFilename(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );
CHAR contentType = new CHAR(mailAttachment.getContentType(), CharacterSet.make(CharacterSet.UTF8_CHARSET) );
STRUCT struct = new STRUCT(structDescriptor, oracleConnection,
new Object[] {blob, attachName, contentType, null}
);
structs[index] = struct;
}
}
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor(ATTACHMENT_LIST, oracleConnection);
ARRAY oracleArray = new ARRAY(arrayDesc, oracleConnection, structs);
ps.setObject(i, oracleArray);
}
此问题与 Oracle JDBC 驱动程序有关,它支持国际化。
请记住将 orai18n.jar 包含在 classpath/pom 文件中,并为您的 ojdbc jar 文件提供正确的版本。
如果缺少 orai18n.jar:
- setParameters: Oracle 类型中的 varchar2 参数将设置为 null
- getResult/getNonNullParameter: varchar2 参数将加载到 java class 作为“???”字符串。