有一个Oracle存储函数:
create or replace function create_role(p_role varchar2)
return pls_integer
is
v_role role.role_db%type;
begin
v_role := regexp_replace(p_role, '[[:space:]]*',''); /* suppression des espaces entre les caractères */
v_role := lower(v_role);
execute immediate 'create role ' || v_role ;
return 1;
exception
when others then /* role or user of same name already exists */
return 0;
end;
我想从Spring调用它:
@Override
@Transactional
public Integer insert(Role role) {
String roleDb = role.getLib().startsWith("role_sse_") ? StringUtils.stripAccents(role.getLib()).toLowerCase() : StringUtils.stripAccents("role_sse_"+role.getLib()).toLowerCase();
simpleJdbcCall = new SimpleJdbcCall(dataSource)
.withFunctionName("create_role");
SqlParameterSource in = new MapSqlParameterSource().addValue("p_role", roleDb);
Integer ret = simpleJdbcCall.executeFunction(Integer.class, in);
if (ret == 1) {
Session sessionDynamic = Utils.createDynamicSession(env);
role.setDb(roleDb);
sessionDynamic.persist(role);
sessionDynamic.flush();
sessionDynamic.close();
}
return ret;
}
在运行时我收到错误:java.sql.SQLException: Invalid column type: 1111
那有什么不对?
答案 0 :(得分:1)
我认为PLS_INTEGER不是标准类型。
如果您能够更改该功能以返回可能修复它的标准NUMBER类型。
另一种选择可能是看......
Strugging with spring SimpleJdbcCall to call Oracle function