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 作为“???”字符串。