在hibernate中调用存储函数

时间:2015-06-12 10:02:44

标签: spring oracle hibernate

我试图在hibernate中调用存储的函数,但是我得到了无效的sql异常。

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;
}

在oracle中测试存储的函数---

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

请告诉我出错的地方

1 个答案:

答案 0 :(得分:1)

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

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

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

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

JDBC语法更具可移植性,PL / SQL块可能更快一些。

祝你好运。