Пропустить и вернуть пользовательский объект массива в ibatis и oracle в java

Я хорошо огляделся по сторонам, но я пока не сталкивался с этим. Я хочу передать пользовательский массив строк из java в oracle и обратно, используя инфраструктуру IBATIS. Кто-нибудь имеет хорошую ссылку на пример? Я называю хранимые procs от IBATIS.

благодаря

Вы должны начать с пользовательского экземпляра TypeHandler . Мы предпочли бы реализовать более простой TypeHandlerCallback , но в этом случае нам нужен доступ к базовому Connection .

 public class ArrayTypeHandler implements TypeHandler { public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType) throws SQLException { if (param == null) { ps.setNull(i, Types.ARRAY); } else { Connection conn = ps.getConnection(); Array loc = conn.createArrayOf("myArrayType", (Object[]) param); ps.setArray(i, loc); } } public Object getResult(CallableStatement statement, int i) throws SQLException { return statement.getArray(i).getArray(); } ... } 

Затем, чтобы подключить его в конфигурации iBATIS:

         {? = call My_Array_Function( ? )}   

Надеюсь это поможет!

bsanders дали мне хорошую отправную точку – вот что мне нужно было сделать, чтобы он работал в среде RAD (websphere 6.2).

 public Object getResult(CallableStatement statement, int i) throws SQLException { return statement.getArray(i).getArray(); //getting null pointer exception here } public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType) throws SQLException { if (param == null) { ps.setNull(i, Types.ARRAY); } else { String[] a = (String[]) param; //ARRAY aOracle = ARRAY.toARRAY(a, (OracleConnection)ps.getConnection()); //com.ibm.ws.rsadapter.jdbc.WSJdbcConnection w = (com.ibm.ws.rsadapter.jdbc.WSJdbcConnection)ps.getConnection()); //com.ibm.ws.rsadapter.jdbc.WSJdbcObject x; Connection nativeConnection = Connection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)ps.getConnection()); ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("F2_LIST", nativeConnection); ARRAY dataArray = new ARRAY(descriptor, nativeConnection, a); ps.setArray(i, dataArray); } } 

Обратите внимание на nativeConnection, который я должен был получить, дескриптор, который я должен был сделать, и так далее. Однако, хотя я могу передавать вещи в базу данных как массив строк, я не смог понять, почему я ничего не получаю. Мой параметр OUT (getResult (CallableStatement statment, int i) бросает исключение нулевого указателя, хотя я устанавливаю параметр out в plsql в базе данных.

 --stored procedure to take a | delimited ids PROCEDURE array_test (argument IN f2_list, result OUT f2_list) AS l_procname_v VARCHAR2 (50) := 'array_test'; l_param_list VARCHAR2 (2000) := l_procname_v || ' param_values: p_string: '; p_status_n NUMBER; p_message_v VARCHAR2 (2000); ret_list f2_list := new f2_list(); l_count_v varchar2(200); BEGIN l_count_v := argument.COUNT; for x in 1..argument.count LOOP pkg_az_common_util.az_debug (package_nm, l_procname_v, pkg_az_data_type_def.debug_num, argument(x) ); end loop; pkg_az_common_util.az_debug (package_nm, l_procname_v, pkg_az_data_type_def.debug_num, l_count_v ); ret_list.extend(); ret_list(1) := 'W'; ret_list.extend(); ret_list(2) := 'X'; ret_list.extend(); ret_list(3) := 'Y'; ret_list.extend(); ret_list(4) := 'Z'; result := ret_list; EXCEPTION WHEN OTHERS THEN p_status_n := pkg_az_common_util.get_error_code; p_message_v := TO_CHAR (p_status_n) || '|' || 'Oracle Internal Exception(' || l_procname_v || ')' || '|' || TO_CHAR (SQLCODE) || '|' || SQLERRM || l_param_list; standard_pkg.log_error (package_nm, l_procname_v, SQLCODE, p_message_v ); IF p_status_n = 1 THEN RAISE; END IF; END array_test; 

Вот как я обращаюсь к нему:

 Map queryParamsTest = new HashMap(); String[] testArray = {"A", "B", "C"}; queryParamsTest.put("argument", testArray); DaoUtils.executeQuery(super.getSqlMapClientTemplate(), "arrayTest", queryParamsTest, queryParamsTest .toString()); //just executes query String[] resultArray = (String[])queryParamsTest.get("result"); for(int x = 0; x< resultArray.length; x++) { System.out.println("Result: " + resultArray[x]); }      {call pkg_az_basic_dev.array_test(?, ? )}  

Есть идеи?

Ну, ребята из компании выяснили решение : вам нужно внедрить метод getResult в свой типHandler и предоставить дополнительный атрибут jdbcTypeName = ORACLE_REAL_ARRAY_TYPE в вашем картографе

Попробуйте использовать statement.getObject(i) а затем кастинг в массив.