Java获取Oracle存储过程返回的自定义嵌套表
2013年01月12日 12:13:22 luckystar2008 阅读数:1363
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qincidong/article/details/8495893
-
在命令窗口执行以下语句,创建自定义类型NESTEDARRAY。
-
create or replace TYPE NESTEDARRAY IS TABLE OF NVARCHAR2(32);
-
在存储过程中使用自定义类型NESTEDARRAY。
-
PROCEDURE GET_ARR_RESULT(INPUTARRAY IN NESTEDARRAY, AR OUT NESTEDARRAY) IS
-
BEGIN
-
AR := NESTEDARRAY();
-
FOR I IN 1 .. INPUTARRAY.COUNT LOOP
-
AR.EXTEND;
-
AR(I) := I|| INPUTARRAY(I);
-
END LOOP;
-
END GET_ARR_RESULT;
-
Java代码:
-
import java.sql.Connection;
-
import java.sql.SQLException;
-
import oracle.jdbc.OracleCallableStatement;
-
import oracle.jdbc.OracleTypes;
-
import oracle.sql.ARRAY;
-
import oracle.sql.ArrayDescriptor;
-
import oracle.sql.Datum;
-
/**
-
* Java获取Oracle存储过程返回自定义类型
-
* @author lucky star
-
*
-
*/
-
public class OracleTypeResultTest {
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
Connection con = null;
-
OracleCallableStatement ocs = null;
-
String sql = "{call test.GET_ARR_RESULT(?,?)}";
-
try {
-
con = DBUtil.dbUtil.getConnection();
-
ocs = (OracleCallableStatement) con.prepareCall(sql);
-
String[] params = {“10001”,”10003”};
-
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("NESTEDARRAY", con);
-
ARRAY inputArray = new ARRAY(arrayDesc, con, params);
-
ocs.setARRAY(1, inputArray);
-
ocs.registerOutParameter(2,OracleTypes.ARRAY,"NESTEDARRAY");
-
ocs.execute();
-
ARRAY array = ocs.getARRAY(2);
-
Datum[] datum = array.getOracleArray();
-
for (int i=0;i<datum.length;i++) {
-
System.out.println(datum[i].intValue());
-
}
-
} catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} finally {
-
try {
-
if(ocs!=null)ocs.close();
-
if(con!=null)con.close();
-
} catch (SQLException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
-
}
-
}
-
用VARCHAR2测试,发现存储过程中无法获取到传入的数组的值。
-
不过,将自定义类型由varchar2改成NVarchar2就成功了。
-
即:create or replace TYPE NESTEDARRAY IS TABLE OF NVARCHAR2(32);不知道什么原因。
https://blog.csdn.net/qincidong/article/details/8495893