2017-07-04 76 views
0

我不得不從內存中的db調用pl sql中的存儲過程。 我把劇本在我的SQL文件Oracle存儲過程和休眠

create or replace PROCEDURE delete_from_db 
(
abi IN ASSEGNO.ABI_ASSEGNO%type, 
cab IN ASSEGNO.CAB_ASSEGNO%type, 
nAss IN ASSEGNO.NUMERO_ASSEGNO%type 
) 
IS 
BEGIN 
delete FROM ASSEGNO WHERE ABI_ASSEGNO = abi AND CAB_ASSEGNO= cab AND NUMERO_ASSEGNO = nAss; 
COMMIT; 
END delete_from_db; 

,我試圖使用Hibernate這樣從我實現調用它:

@覆蓋 公共無效deleteAssegno(AssegnoId idAssegno){

Session s = getHibernateTemplate().getSessionFactory().openSession(); 
s.getNamedQuery("delete_from_db").setString(0, idAssegno.getAbiAssegno()).setString(1, idAssegno.getCabAssegno()).setLong(2, idAssegno.getNumeroAssegno()); 
s.close(); 

}

但是當我去測試我有這個錯誤:

org.hibernate.MappingException: Named query not known: delete_from_db 
    at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:93) 
    at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1407) 
    at it.bnl.btre.orchass.busin.dao.impl.AssegnoDaoServiceImpl.deleteAssegno(AssegnoDaoServiceImpl.java:75) 
    at it.bnl.btre.orchass.busin.facade.service.impl.CancellazioneDocumentaleServiceImpl.deleteFromDb(CancellazioneDocumentaleServiceImpl.java:109) 
    at it.bnl.btre.orchass.busin.facade.service.impl.CancellazioneDocumentaleServiceImpl.deleteFromDoc(CancellazioneDocumentaleServiceImpl.java:70) 
    at it.bnl.btre.orchass.busin.facade.CancellazioneDocumentaleFacade.handle(CancellazioneDocumentaleFacade.java:32) 
    at it.bnl.btre.orchass.busin.facade.test.CancellazioneDocumentaleFacadeTest.testOk(CancellazioneDocumentaleFacadeTest.java:26) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56) 
    at java.lang.reflect.Method.invoke(Method.java:620) 
    at junit.framework.TestCase.runTest(TestCase.java:176) 
    at junit.framework.TestCase.runBare(TestCase.java:141) 
    at junit.framework.TestResult$1.protect(TestResult.java:122) 
    at junit.framework.TestResult.runProtected(TestResult.java:142) 
    at junit.framework.TestResult.run(TestResult.java:125) 
    at junit.framework.TestCase.run(TestCase.java:129) 
    at junit.framework.TestSuite.runTest(TestSuite.java:255) 
    at junit.framework.TestSuite.run(TestSuite.java:250) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 

我在互聯網上搜索,但所有的教程都是關於MySql數據庫或其他。

謝謝大家!

回答

1

您需要直接調用存儲過程,例如,通過創建一個org.springframework.jdbc.object.StoredProcedure

StoredProcedure proc = new StoredProcedure(jdbcTemplate, "delete_from_db"); 

定義參數:

proc.declareParameter(new SqlParameter(Types.VARCHAR)); 
... 

最後調用prodedure

proc.execute(<params>); 

對於一個完整的例子,例如見Spring JDBC Template for calling Stored Procedures