①存储过程返回数组类型 CREATE OR REPLACE TYPE SCOTT.EMP_LINE AS OBJECT ( EMPNO NUMBER(4) , ENAME VARCHAR2(20) ); CREATE OR REPLACE TYPE SCOTT.EMP_ARRAY AS TABLE OF EMP_LINE; ②jdbc的写法,定义一个SQLData的类 1. package com.pkg.emp; 2. import java.sql.SQLData; 3. import java.sql.SQLException; 4. import java.sql.SQLInput; 5. import java.sql.SQLOutput; 6. 7. public class EmpObj implements SQLData{ 8. private String sql_type; 9. public int empno; 10. public String ename; 11. public EmployeeObj() 12. { 13. } 14. public EmployeeObj(String sql_type, 15. int empno, 16. String ename, 17. ) { 18. this.sql_type = sql_type; 19. this.empno = empno; 20. this.ename = ename; 21. } 22. /* (non-Javadoc) 23. * @see java.sql.SQLData#getSQLTypeName() 24. */ 25. public String getSQLTypeName() throws SQLException { 26. // TODO Auto-generated method stub 27. return sql_type; 28. } 29. 30. /* (non-Javadoc) 31. * @see java.sql.SQLData#writeSQL(java.sql.SQLOutput) 32. */ 33. public void writeSQL(SQLOutput stream) throws SQLException { 34. // TODO Auto-generated method stub 35. stream.writeInt(empno); 36. stream.writeString(ename); 37. } 38. 39. /* (non-Javadoc) 40. * @see java.sql.SQLData#readSQL(java.sql.SQLInput, java.lang.String) 41. */ 42. public void readSQL(SQLInput stream, String typeName) throws SQLException { 43. // TODO Auto-generated method stub 44. sql_type = typeName; 45. 46. empno = stream.readInt(); 47. ename = stream.readString(); 48. } 49. // 省略GET SET 50. } ③取得数据的过程 1. OracleCallableStatement stmt =(OracleCallableStatement)conn.prepareCall( "{call ?:= xxx }" ); 2. stmt.registerOutParameter( 1, OracleTypes.ARRAY,"EMP_ARRAY" ); 3. stmt.execute(); 4. 5. ARRAY simpleArray = stmt.getARRAY(1); 6. 7. Map map = conn.getTypeMap(); 8. map.put("EMP_LINE", Class.forName("com.pkg.emp.EmpObj")); // 类路径 9. // 读出数据 10. Object[] employees = (Object[]) simpleArray.getArray(); 11. for( int i = 0; i < employees.length; i++ ){ 12. EmployeeObj emp = (EmployeeObj) employees[i]; 13. System.out.println(emp.getEname()); 14. }