JPA2.1 - 调用返回CLOB的存储过程

时间:2014-05-06 11:40:36

标签: java spring hibernate jpa

我使用JPA 2.1和hibernate作为实现供应商。

我正在尝试调用一个返回CLOB的存储过程。

   StoredProcedureQuery storedProcQuery = entityManager.createStoredProcedureQuery("pkg_test.get_clob");
        storedProcQuery .registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
        storedProcQuery .registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
        storedProcQuery .registerStoredProcedureParameter(3, oracle.sql.CLOB.class, ParameterMode.OUT);
        storedProcQuery .setParameter(1, "ABCD");
        storedProcQuery .setParameter(2, "XYZ");
        storedProcQuery.execute();   //here i get the following exception. 

*Caused by: org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.result.internal.OutputsImpl.convert(OutputsImpl.java:96)
    at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:73)
    at org.hibernate.procedure.internal.ProcedureOutputsImpl.<init>(ProcedureOutputsImpl.java:49)
    at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:426)
    at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:378)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:251)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:234)
    ... 33 more
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_CLOB'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)*

这里我传递的类型为oracle.sql.CLOB.class,它是java.sql.CLOB的一个实现。

我已使用纯JDBC实现测试了相同的PL / SQL过程,并且其工作正常。

但是想要使用JPA2.1功能。

你能否告诉我上面的错误?

谢谢你。

1 个答案:

答案 0 :(得分:1)

它不是hibernate或jpa或java问题。 此错误来自您调用'GET_CLOB'过程

的oracle jdbc驱动程序

检查oracle db error codes手册:

ORA-06550 :行字符串,列字符串:字符串

原因:发生了PL / SQL编译错误。为行和列指定的数字是发生错误的PL / SQL块中的位置。

操作:有关错误的详细信息,请参阅以下PL / SQL消息。

ORA-06550是发生语法错误的PL / SQL中的位置的错误点,后面是编译时错误的更具描述性的消息: