我有以下类型:
create or replace TYPE mytimestamp AS VARRAY(300) OF TIMESTAMP(6);
create or replace TYPE trade_history_dts_array AS VARRAY(300) OF mytimestamp;
这些类型在存储过程中以这种方式使用:
trade_history_dts tradehistorydtsarray ;
FOR i IN 1..20
loop
trade_history_dts(i) := mytimestamp();
LOOP
trade_history_dts(i).extend();
FETCH trade_history_cursor INTO
trade_history_dts(i)(j),
dbms_output.put_line(trade_history_dts(i)(j));
j := j+1;
exit when trade_history_cursor%notfound;
END LOOP;
j:=1;
end loop;
测试存储过程,我可以得到正确的结果:
贸易信息1
trade_history_dts(1)(1)17-OCT-05 03.49.57.000000 PM
trade_history_dts(1)(2)17-OCT-05 03.49.58.000000 PM
贸易信息2
trade_history_dts(2)(1)27-JUN-05 09.02.59.000000 AM
trade_history_dts(2)(2)27-JUN-05 09.02.59.000000 AM
trade_history_dts(2)(3)27-JUN-05 09.03.01.000000 AM
贸易信息3
trade_history_dts(3)(1)09-FEB-06 09.31.03.000000 AM
trade_history_dts(3)(2)09-FEB-06 09.31.05.000000 AM
....
现在我想在java中获得这个结果,并将其转换为二维数组。
我尝试了以下内容:
Timestamp[][] trade_history_dts = (Timestamp[][])trade_history_dts_arr.getArray();
但它不起作用。有人知道如何将它转换为java中的二维数组吗?谢谢!
答案 0 :(得分:4)
您采用的方法不起作用,因为它自己的JDBC不支持Oracle的集合类型。您需要处理Oracle JDBC驱动程序中包含的类型的对象,以便以您希望的方式访问结果集的内容。这将涉及将ResultSet
对象转换为OracleResultSet
,以便可以通过oracle.sql.ARRAY
元素的实例访问集合的内部元素。
您还可以使用getObject
方法从ResultSet中读取Object,然后将其强制转换为代表集合的oracle.sql.ARRAY
实例。有关此机制的详细信息,请参阅Oracle Database JDBC Developer's Guide and Reference。
此外,您需要解析结果集中的每个元素,并以类似的方式处理它们,因为您正在返回多级集合。有关详细信息,请参阅the same guide in a separate section。