передача Cursor в качестве параметра с использованием объекта запроса Hibernate в хранимую процедуру - PullRequest
0 голосов
/ 03 сентября 2011

У меня есть хранимая процедура, которая принимает курсор в качестве параметра. У меня есть именованный запрос, определенный в отображениях hibernate для вызова хранимой процедуры ... Мне нужно сделать вызов из DAO, используя hibernateTemplate (spring, hibernate)

Вот как я это делаю ..

Query q =  (Query) hibernateTemplate.findByNamedQuery("getFromGTT", OracleTypes.CURSOR);

но это дает мне какое-то исключение ...

org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:2214)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
    at org.hibernate.loader.Loader.list(Loader.java:2090)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150)
    at org.springframework.orm.hibernate3.HibernateTemplate$32.doInHibernate(HibernateTemplate.java:916)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
    at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedQuery(HibernateTemplate.java:907)
    at dao.GTTDaoImpl$1.doInHibernate(GTTDaoImpl.java:27)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:338)
    at dao.GTTDaoImpl.getDataFromGTT(GTTDaoImpl.java:23)
    at test.TestOracleProcedures.test(TestOracleProcedures.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
    at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
    at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
    at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GET_FROM_GTT'

нужно решение .. Спасибо

1 Ответ

1 голос
/ 03 сентября 2011

Вы должны опубликовать свою спецификацию процедуры, чтобы люди могли лучше вам помочь, но, поскольку вы упомянули прохождение курсора, вы должны знать, что существуют ограничения на вызов хранимых процедур из Hibernate :

Для Oracle применяются следующие правила:

Функция должна возвращать набор результатов. Первый параметр Процедура должна быть OUT, которая возвращает набор результатов. Это сделано используя тип SYS_REFCURSOR в Oracle 9 или 10. В Oracle вам нужно определить тип REF CURSOR. Смотрите литературу Oracle для дальнейшего информация.

Если вы не можете удовлетворить эти требования, вы все равно можете вызвать процедуру, вызвав собственный вызов JDBC.

Кроме того, OracleTypes.CURSOR - это тип JDBC, а не переменная связывания. Если вашей процедуре требуется значение для выполнения, вам нужно передать это фактическое значение в findByNamedQuery .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...