2015-06-12 48 views
0

我想在休眠中调用存储函数,但我得到无效的sql异常。在Oracle在休眠调用存储函数

Java代码---

public Integer callSqlBlock(){ 
     Integer outputValue =1; 
     Session session = getHibernateTemplate().getSessionFactory().getCurrentSession(); 
     session.doWork(new Work() { 
             @Override 
             public void execute(Connection conn) 
               throws SQLException { 
               CallableStatement stmt = conn.prepareCall("? = call test(?)"); 
               stmt.registerOutParameter(1, Types.INTEGER); 
               stmt.setString(2, "callIndex"); 
               stmt.execute(); 
               Integer output = stmt.getInt(1); 
               test(output); 

              } 
         }); 
     Connection oracleConnection = getJavaSqlConnectionFromHibernateSession(session); 
     // CallableStatement statement = oracleConnection.prepareCall(sql) 

     return outputValue; 
} 

测试存储功能---

create or replace 
function test(str in varchar2) return number 
as 
begin 
if str = 'test' then 
return 1; 
end if; 
return 0; 
end; 

请让我知道我错了

回答

1

您可以更改prepareCall通过将call括在花括号中来使用JDBC转义语法,如

CallableStatement stmt = conn.prepareCall("{? = call test(?)}"); 

,或者您可以在通话使用PL/SQL块,如

CallableStatement stmt = conn.prepareCall("begin ? := test(?); end;"); 

的JDBC语法更便携,PL/SQL块可能是没法比的一些少量的更快。

祝你好运。

+0

感谢鲍勃,它为我工作。 – Abhi