ibatis查询结果返回数组_在java中传递并返回ibatis和oracle中的自定义数组对象

博主在使用Websphere6.2和RAD环境中遇到一个问题,即在调用Oracle数据库的存储过程时,无法正确获取OUT参数。存储过程在PL/SQL中设置并返回了一个字符串数组,但在Java代码中调用CallableStatement时,getResult()方法抛出NullPointerException。问题可能在于获取NativeConnection、创建ArrayDescriptor以及设置和获取ARRAY对象的过程中。目前,博主能够成功将字符串数组传递到数据库,但无法正确接收返回的结果。存储过程在PL/SQL中已经定义并填充了结果,但在Java层面的处理上出现了问题。

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))抛出一个空指针异常,即使我在数据库的plsql中设置了out参数。

--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(?, ? )}

有任何想法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值