[ 
https://issues.apache.org/jira/browse/IBATIS-541?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12637758#action_12637758
 ] 

Denis Nelubin commented on IBATIS-541:
--------------------------------------

Yes. As I understand, the patch introduces StoredProcedureTypeHandler with 
registerOutParameter() method. This really can help to add NCHAR support.

> NCHAR, NVARCHAR Oracle support
> ------------------------------
>
>                 Key: IBATIS-541
>                 URL: https://issues.apache.org/jira/browse/IBATIS-541
>             Project: iBatis for Java
>          Issue Type: Wish
>          Components: SQL Maps
>            Reporter: Denis Nelubin
>            Priority: Minor
>
> Oracle JDBC driver has strange support of national character data types. It's 
> required to call oracle.jdbc.OraclePreparedStatement.setFormOfUse(int 
> paramIndex, short formOfUse) method before calling to setString() or 
> registerOutParameter() (for OracleCallableStatement). Otherwise the national 
> characters will be converted to the database encoding which can cause data 
> loss.
> The first form of use (on setting parameters of prepared statement) can be 
> solved by such custom TypeHandler:
> import java.sql.PreparedStatement;
> import java.sql.SQLException;
> import java.sql.Statement;
> import oracle.jdbc.OraclePreparedStatement;
> import org.apache.commons.dbcp.DelegatingStatement;
> import com.ibatis.sqlmap.engine.type.StringTypeHandler;
> public class NVarcharTypeHandler extends StringTypeHandler {
>     public void setParameter(PreparedStatement ps, int i, Object parameter, 
> String jdbcType)
>             throws SQLException {
>         Statement delegate = ps;
>         while (delegate instanceof DelegatingStatement) {
>             delegate = ((DelegatingStatement)delegate).getDelegate();
>         }
>         if (delegate instanceof OraclePreparedStatement) {
>             ((OraclePreparedStatement)delegate).setFormOfUse(i, 
> OraclePreparedStatement.FORM_NCHAR);
>         }
>         ps.setString(i, ((String) parameter));
>     }
> }
> But the second form of use (on registering output parameters) requires 
> changes in SQL Maps control flow. There is no extension point to get access 
> to CallableStatement before registering output parameters.
> I propose to extend TypeHandler interface by adding such method:
> void registerOutParameter(CallableStatement cs, int columnIndex, String 
> jdbcType, Integer numbericScale)
> and modifying SqlExecutor to call this method before registering output 
> parameters.
> Also it will be good to include support of this Oracle data types into base 
> distribution.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to