2017-12-11 3 views
0

Oracleストアドプロシージャからデータを取得しようとしています。問題は、私たちのデータベースには同じ名前と同じパラメータを持つ関数と手続きがあることです。Spring:正しい呼び出しシグネチャを判断できません - 複数のプロシージャ/関数/シグネチャ

私はそれを呼び出すようにしてみてください。

@Autowired 
    public void setDataSource (@Qualifier("dataSource") DataSource dataSource) { 
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
     jdbcTemplate.setResultsMapCaseInsensitive(true); 
     this.functionGetSomeCode = new SimpleJdbcCall(jdbcTemplate) 
       .declareParameters(new SqlOutParameter("RETURN", OracleTypes.NUMBER)) 
       .withFunctionName("get_some_code").withSchemaName("XXX").withCatalogName("some_pkg"); 
    } 

    public Integer getSomeCode (String incoming) { 
     SqlParameterSource incomingParameters = new MapSqlParameterSource().addValue("incoming", incoming); 
     return functionGetSomeCode.executeFunction(Integer.class, incomingParameters); 
    } 

は、私は例外を取得:

springframework.dao.InvalidDataAccessApiUsageException: Unable to determine the correct call signature - multiple procedures/functions/signatures 

は何かに機能/手順の名前を変更するには、DBAを求めず、このような状況に対処する方法はあります違う?

答えて

1

同じ名前の関数とプロシージャを呼び出すことはできましたが、必ずしも機能するとは限りません。 あなたの例では、入力パラメータを宣言していないようです。可能な限りパッケージ宣言によく似た型のinputおよびoutputパラメータを宣言してみてください。それでも問題が解決しない場合は、ProcedureColumnMetaDataAccessをオフにしてみてください。ただし、必ずテストしてください。あなたの入力のための

protected SimpleJdbcCall buildJdbcCall(JdbcTemplate jdbcTemplate) { 
    SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate) 
      .withSchemaName(schema) 
      .withCatalogName(catalog) 
      .withFunctionName(functionName) 
      // can use withProcedureName(procedureName) for procedures 
      //.withReturnValue() 
      // .withoutProcedureColumnMetaDataAccess() // may need this 
      .declareParameters(buildSqlParameters()); 
    return call; 
} 

public SqlParameter[] buildSqlParameters() { 
    return new SqlParameter[]{ 
     new SqlParameter("p_id", Types.VARCHAR), 
     new SqlParameter("p_office_id", Types.VARCHAR), 
     new SqlOutParameter("l_clob", Types.CLOB) 
    }; 
} 
+0

おかげで、しかし、あなたが密接にコードを勉強している場合、私のパラメータ(inとout)が宣言されます。ここでは

は一例です。 –

+0

"incoming"パラメータをdeclareParameters配列で宣言せずにexecuteFunction呼び出しに渡しています。 – Ryan

関連する問題