我们现在用的job平台 定时调用后端的执行存储过程的代码。代码是Spring的jdbcTemplate写的最后只是拼成 call function_name() 这样的sql并执行。但是时好时坏的
失败的话会报:org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [call CP_PLC_ACC()]; nested exception is java.sql.SQLException: ORA-06576: not a valid function or procedure name.但是检查数据库端 发现这个存储过程是有且有权限调用的。而且上面还成功过两次。plsql端也可以调用成功

解决方案 »

  1.   

    再多给点信息。
    贴图中四个是一个job还是多个,如何拼接的,如何调用
      

  2.   

    是四个JOB 但是他们都调用的同一个执行类 单例的。
    执行代码如下:
    /**
     *   执行存储过程 (无返回值的)
     * @param dbname 数据源名字
     * @param spname 存储过程名字
     * @param params 传入存储过程参数(null为没有传入参数)
     * @return 执行影响的行数,-1为失败
     */
    @Override
    public String Execute(String dbname, String spname, Object[] params) {
    int iReturn=-1;
    try{
    if(null==jdbcTemplate){
    log.warn("jdbcTemplate is null");
    }
    if(null==spname||0==spname.trim().length()){
    log.warn("vSpname is null");
    return null;
    }
    if(null!=dbname && dbname.trim().length()>0){
    log.info("dsName="+dbname);
    this.jdbcTemplate=(JdbcTemplate)AppUtil.getBean(dbname);
    }
    String strSQL="call "+spname+"(";
    if(null!=params && params.length>0){
    for(int i=0;i<params.length;i++){
    if(0==i)
    strSQL=strSQL+"?";
    else
    strSQL=strSQL+",?";
    }
    }
    strSQL=strSQL+")";
    if(null!=params && params.length>0){
    log.debug("执行带参数的存储过程:"+dbname+spname+" info:"+Log4jUtil.getInfo(strSQL, params));
    iReturn=this.jdbcTemplate.update(strSQL, params);
    }else{
    log.debug("执行不带参数的存储过程:"+dbname+spname+" info:"+strSQL);
    iReturn=this.jdbcTemplate.update(strSQL);
    }
    log.info("iReturn="+iReturn);
    log.info("strSQL="+strSQL);
    // log.info("params="+params[0].toString());
    }catch(Exception ex){
    log.error("",ex);
    throw new ApplicationException(ex.getMessage());
    }
    return ""+iReturn;
    }