Hi everyone,

Im having an issue while trying to submit an Array of Objects to an
Oracle Stored procedure.

The map file looks like:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-2.dtd";>

<sqlMap namespace="Converter">
 <typeAlias alias="keywordItems"
type="ch.generali.converter.bean.KeywordItem" />


       <resultMap id="keywordsResult"
class="ch.generali.converter.bean.KeywordItem">
       <result property="key" jdbcType="VARCHAR"
javaType="java.lang.String" column="KEY"/>
       <result property="value" jdbcType="VARCHAR"
javaType="java.lang.String" column="VALUE"/>
        </resultMap>
        
<parameterMap id="getKeywordParam" class="ch.generali.converter.bean.Keyword">
    <parameter property="keywords"
typeHandler="ch.generali.converter.dao.KeywordTypeHandlerCallback"
javaType="java.util.List" jdbcType="VVEVER.KEYWORD_TAB"
typeName="VVEVER.KEYWORD_TAB"  mode="INOUT"  />
    <parameter property="language" jdbcType="NUMERIC" mode="IN"
javaType="java.lang.Integer" />
    <parameter property="vertragsnr" jdbcType="VARCHAR" mode="IN"
javaType="java.lang.String" />
</parameterMap>
        
        <procedure id="getKeyword" parameterMap="getKeywordParam">
            {call 
vvever.pck_ev_textbaustein_liste.ip_get_textbaustein_liste(?,?,?,?)}
        </procedure>

</sqlMap>


my TypeHandlerCallback class looks like:



package ch.generali.converter.dao;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.PoolableConnection;

import oracle.jdbc.driver.OracleConnection;
import oracle.jdbc.internal.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;


import ch.generali.converter.bean.Keyword;
import ch.generali.converter.bean.KeywordItem;

import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;
import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;

public class KeywordTypeHandlerCallback implements TypeHandlerCallback {

         static {
                 JdbcTypeRegistry.setType("VVEVER.KEYWORD_ITEM", 
OracleTypes.STRUCT);
                 JdbcTypeRegistry.setType("VVEVER.KEYWORD_TAB",
OracleTypes.ARRAY);
          }
        
        public Object getResult(ResultGetter getter) throws SQLException {
                // TODO Auto-generated method stub
                return null;
        }

        public void setParameter(ParameterSetter setter, Object parameter)
                        throws SQLException {
                
                        
                        Statement stmt = setter.getPreparedStatement();
                        Connection conn = stmt.getConnection();
//                      Map<String, String> parameterMap = (HashMap<String, 
String>)parameter;

                          List<KeywordItem> keywordItems = (List<KeywordItem>) 
parameter;
                          KeywordItem[] keywordArray = new 
KeywordItem[keywordItems.size()];

                        
                        
                    for (int i = 0; i < keywordArray.length; i++) {
                        keywordArray[i] = keywordItems.get(i);
                    }

                        
                        PoolableConnection pc = (PoolableConnection)conn;
                        OracleConnection oc = 
(OracleConnection)pc.getDelegate();

                        Map map = oc.getTypeMap();
                        
                        map.put("VVEVER.KEYWORD_ITEM",KeywordItem.class);


                        
                        ArrayDescriptor desc =
ArrayDescriptor.createDescriptor("VVEVER.KEYWORD_TAB", oc);
                
this is where it fails -->      ARRAY array = new ARRAY(desc, oc,keywordArray);
                

                        setter.setArray(array);

        }

        public Object valueOf(String s) {
                // TODO Auto-generated method stub
                return null;
        }

}

The KeywordItem looks like:

public class KeywordItem {
        public String key;
        public String value;
        public String getKey() {
                return key;
        }
        public void setKey(String key) {
                this.key = key;
        }
        public String getValue() {
                return value;
        }
        public void setValue(String value) {
                this.value = value;
        }

}


And the Object type in Oracle like:

CREATE type keyword_item
 AS
   object (
     key VARCHAR2(20) ,
    value VARCHAR2(1000) );
/

create or replace type keyword_tab as table of keyword_item;




What could cause this behavour?

---------------------------------------------------------------------
To unsubscribe, e-mail: user-java-unsubscr...@ibatis.apache.org
For additional commands, e-mail: user-java-h...@ibatis.apache.org

Reply via email to