Spring:JdbcTemplate在尝试调用存储的db函数时抛出PLS-00201

时间:2017-08-07 12:35:54

标签: java spring oracle

我的oracle数据库中有一个名为GET_ACS_SERVER_AUTH_METHOD_REP的函数。

这是我在数据库中执行函数调用的方法:

public String getAuthReport () throws SQLException {
        final Connection connection = jdbcTemplate.getDataSource().getConnection();

        List <SqlParameter> declaredParameters = new ArrayList <SqlParameter>();
        declaredParameters.add(new SqlParameter("start_d", Types.DATE));
        declaredParameters.add(new SqlParameter("end_d", Types.DATE));
        declaredParameters.add(new SqlOutParameter("return", Types.CLOB));

        Map <String, Object> resultMap = jdbcTemplate.call(new CallableStatementCreator() {
            @Override
            public CallableStatement createCallableStatement (Connection con) throws SQLException {
                CallableStatement callableStatement = connection.prepareCall("{call GET_SERVER_AUTH_METHOD_REP(?, ?, ?)}");
                callableStatement.setDate(1, java.sql.Date.valueOf("2016-01-01"));
                callableStatement.setDate(2, java.sql.Date.valueOf("2017-06-30"));
                callableStatement.registerOutParameter(3, Types.CLOB);
                return callableStatement;
            }
        }, declaredParameters);
        return "success";
    }

遗憾的是,这不起作用并返回此错误:

Caused by: java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'GET_ACS_SERVER_AUTH_METHOD_REP' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

我问过我们的DBA我是否可能缺少某些权限,但他说没有。

此外,我还读到oracle版本12时oracle / spring存在一些错误。

也许有人遇到类似的东西并设法解决它?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果这是你的功能定义

create or replace FUNCTION get_server_auth_method_rep(start_d DATE, end_d DATE) return CLOB 

代码应如下所示。

CallableStatement callableStatement = con.prepareCall("{? = call GET_SERVER_AUTH_METHOD_REP(?,?)}"); 
callableStatement.registerOutParameter(1, Types.CLOB);
callableStatement.setDate(2, java.sql.Date.valueOf("2016-01-01"));
callableStatement.setDate(3, java.sql.Date.valueOf("2017-06-30"));

答案 1 :(得分:0)

事实证明,我传递给具有调用数据库中函数的方法的类的构造函数的DataSource bean是使用错误的数据库凭据传递的。我有多个DataSources,我必须使用@Qualifier注释来定义要传入的正确数据。