我试图在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;
请告诉我出错的地方
答案 0 :(得分:1)
您可以通过将prepareCall
括在大括号中来更改call
行以使用JDBC转义语法,如
CallableStatement stmt = conn.prepareCall("{? = call test(?)}");
或者您可以在通话中使用PL / SQL块,例如
CallableStatement stmt = conn.prepareCall("begin ? := test(?); end;");
JDBC语法更具可移植性,PL / SQL块可能更快一些。
祝你好运。