必须使用OracleConnection创建ARRAY和STRUCT,因标准java.sql.Connection无对应方法;需unwrap获取OracleConnection实例,注意代理对象需连续unwrap;ojdbc8.jar为必需依赖;传TABLE类型用createARRAY,OBJECT类型用createStruct配合StructDescriptor;类型名须全大写、带schema且严格匹配数据库定义。

必须用 OracleConnection 才能创建 ARRAY 和 STRUCT
标准 java.sql.Connection 接口不提供 createARRAY 或 createStruct 方法,这些是 Oracle 特有扩展。直接 cast 会失败,必须先 unwrap 成 OracleConnection:
OracleConnection conn = connection.unwrap(OracleConnection.class)- 如果用的是 Spring JdbcTemplate 或 HikariCP,注意其
getConnection()返回的可能是代理对象,需连续 unwrap(如unwrap(OracleConnection.class).unwrap(OracleConnection.class)) - ojdbc8.jar 是硬性依赖,
ojdbc6或更老版本对嵌套STRUCT支持极差,容易在setObject时抛Unsupported type
传 TABLE 类型参数:只用 createARRAY,别碰 createStruct
Oracle 的自定义集合类型(如 CREATE TYPE str_list AS TABLE OF VARCHAR2(100))在 JDBC 中映射为 oracle.sql.ARRAY,不是 STRUCT。用 createStruct 传会直接报错:
- 错误现象:
java.sql.SQLException: invalid name pattern或ORA-04043: object does not exist - 正确做法:先构造
Object[]元素数组(不能是String[]),再调用conn.createARRAY("STR_LIST", elements) -
elements不能为空(null),空集合必须传new Object[0] -
typeName必须全大写、带 schema(如"SCOTT.STR_LIST"),大小写敏感,且当前用户需有EXECUTE权限
传 OBJECT 类型参数:用 createStruct + StructDescriptor
只有 SQL 层定义的 OBJECT 类型(如 CREATE TYPE person AS OBJECT(name VARCHAR2(50), age NUMBER))才用 createStruct:
- 必须先用
StructDescriptor描述结构:StructDescriptor desc = new StructDescriptor("PERSON", conn) - 类型名同样要全大写、schema 显式写出,否则
Invalid name pattern - 元素数组
Object[]中每个值顺序必须严格对应数据库中OBJECT的字段定义顺序 - 如果
OBJECT含嵌套STRUCT或ARRAY,需递归构造——先做内层,再塞进外层Object[]
从 ResultSet 取出 STRUCT/ARRAY 时别直接强转
从查询结果里读 STRUCT 或 ARRAY 字段,不能简单 rs.getObject("col") 后强转:
- 应先确认列类型:
rs.getMetaData().getColumnTypeName(i),避免类型不匹配 - 取
STRUCT推荐:STRUCT s = (STRUCT) rs.getObject("person_col"),再用s.toJDBCObject(conn)转为Object[]数组 - 取
ARRAY推荐:ARRAY a = (ARRAY) rs.getArray("list_col"),再用a.getArray()或a.getResultSet()拆解 - 注意驱动默认不会把
STRUCT自动转成 Java Bean,反射填充需手动做字段名映射(如first_name→firstName),且防循环引用
实际最易被忽略的一点:所有类型名(typeName)必须和数据库中 CREATE TYPE 语句里声明的**完全一致**——包括大小写、schema 前缀、是否带双引号。少一个字母或大小写错,就会卡在 Invalid name pattern,而这个错误信息根本不提示具体哪个字符错了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











