调用存储函数时数据类型不匹配

时间:2017-03-21 10:45:15

标签: spring oracle jdbc

有一个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

那有什么不对?

1 个答案:

答案 0 :(得分:1)

我认为PLS_INTEGER不是标准类型。

如果您能够更改该功能以返回可能修复它的标准NUMBER类型。

另一种选择可能是看......

Strugging with spring SimpleJdbcCall to call Oracle function