Oracle LONG类型对应Java类型及Spring Data JPA调用存储过程报错排查
解决Spring Data JPA调用Oracle带LONG参数存储过程的PLS-00306/ORA-06550错误
你的问题核心是Oracle LONG类型参数与JPA映射不匹配,以及调用时的参数模式/类型/顺序错误,以下是针对性的解决方法:
1. 正确的参数映射逻辑
Oracle的LONG类型是字符大对象(最大2GB),虽然官方推荐用CLOB替代,但如果存储过程已定义为LONG,JPA中需按以下方式映射:
- 对于IN类型的LONG参数:直接用
String类型配合LOB类型声明,不要用Character[]/char[]——这些数组类型无法被JPA正确解析为Oracle LONG,直接触发类型不匹配错误。 - 对于OUT类型的LONG参数:用
java.sql.Clob接收,再转换为String。
2. 两种可行的实现示例
方式一:Spring Data JPA Repository注解方式
在实体类上定义存储过程映射:
@Entity @StoredProcedureQuery( name = "MyProcedure", procedureName = "YOUR_ORACLE_PROCEDURE_NAME", parameters = { @StoredProcedureParameter( mode = ParameterMode.IN, name = "P_INPUT", type = String.class, lobType = LobType.CLOB // 关键:指定LOB类型适配LONG ), // 其他参数按需添加,比如OUT参数 @StoredProcedureParameter( mode = ParameterMode.OUT, name = "P_OUTPUT", type = Clob.class, lobType = LobType.CLOB ) } ) public class DummyEntity { @Id private Long id; // 仅需满足JPA实体要求,无需对应真实表 }
在Repository中调用:
@Repository public interface DummyRepository extends JpaRepository<DummyEntity, Long> { @Procedure(name = "MyProcedure") void executeProcedure( @Param("P_INPUT") String inputParam, @Param("P_OUTPUT") Out<Clob> outputParam ); }
调用时处理OUT参数:
// 注入Repository @Autowired private DummyRepository repo; public void callProcedure() { String input = "你的长文本内容"; Out<Clob> outputHolder = new Out<>(Clob.class); repo.executeProcedure(input, outputHolder); // 将Clob转换为String Clob outputClob = outputHolder.getValue(); String output = outputClob.getSubString(1, (int) outputClob.length()); }
方式二:EntityManager手动调用(更灵活)
直接通过EntityManager构建存储过程查询,避免注解配置的限制:
@Autowired private EntityManager entityManager; public void callLongParamProcedure(String input) { StoredProcedureQuery query = entityManager.createStoredProcedureQuery("YOUR_ORACLE_PROCEDURE_NAME"); // 注册IN参数:指定类型为String,适配LONG类型 query.registerStoredProcedureParameter("P_INPUT", String.class, ParameterMode.IN); query.setParameter("P_INPUT", input); // 如果有OUT参数 query.registerStoredProcedureParameter("P_OUTPUT", Clob.class, ParameterMode.OUT); // 执行存储过程 query.execute(); // 处理OUT参数 Clob outputClob = (Clob) query.getOutputParameterValue("P_OUTPUT"); String output = outputClob.getSubString(1, (int) outputClob.length()); }
3. 必查的错误排查点
- 参数名称/顺序匹配:ORA-06550常因参数名拼写错误、顺序与存储过程定义不一致导致,务必核对存储过程的参数名和模式(IN/OUT)。
- Oracle驱动版本:确保使用ojdbc8或ojdbc11(对应Java 8+/11+),老版本驱动对LONG/CLOB的映射存在兼容性问题。
- 参数长度限制:如果输入文本超过JVM内存可承载的String上限,建议分段处理或改用Clob直接传入。
内容的提问来源于stack exchange,提问作者Sina Ramezani
相关产品推荐
相关产品推荐

