2013-12-19 208 views
1

我想用spring的SimpleJdbc調用調用存儲函數。我寫了一個簡單的函數,它將兩個數字作爲輸入並返回它們的總和。我使用Oracle 11.2g作爲數據庫。我沒有得到任何例外,但同時也沒有得到結果。當通過sql-plus從匿名PL/SQL塊調用時,該函數運行良好。代碼如下:使用spring的SimpleJdbcCall不執行輸出執行存儲函數

SimpleJdbcCall _simpleJdbcCall=new SimpleJdbcCall(this.jdbcTemplate); 
_simpleJdbcCall.withCatalogName("BROADCASTSHEETMANAGEMENT"); 
_simpleJdbcCall.withSchemaName("PPV"); 
_simpleJdbcCall.withFunctionName("TEST"); 
_simpleJdbcCall.withoutProcedureColumnMetaDataAccess(); 

_simpleJdbcCall.declareParameters(new SqlParameter("newChangeSequence",java.sql.Types.NUMERIC)); 
_simpleJdbcCall.declareParameters(new SqlParameter("number1",java.sql.Types.NUMERIC)); 
_simpleJdbcCall.declareParameters(new SqlParameter("number2",java.sql.Types.NUMERIC)); 

MapSqlParameterSource mapSqlParameterSource1=new MapSqlParameterSource(); 
mapSqlParameterSource1.addValue("newChangeSequence", Integer.valueOf(0)); 
mapSqlParameterSource1.addValue("number1", Integer.valueOf(10)); 
mapSqlParameterSource1.addValue("number2", Integer.valueOf(20)); 

    newChangeSequence = _simpleJdbcCall.executeFunction(Integer.class,mapSqlParameterSource1); 

System.out.println("Returned changeSequence is: " + newChangeSequence); 

堆棧跟蹤顯示以下信息:

2013/12/19 18:52:53,604 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - Added declared parameter for [TEST]: newChangeSequence 
2013/12/19 18:52:53,604 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - Added declared parameter for [TEST]: number1 
2013/12/19 18:52:53,604 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - Added declared parameter for [TEST]: number2 
2013/12/19 18:52:53,605 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - JdbcCall call not compiled before execution - invoking compile 
2013/12/19 18:52:53,608 [main] - [] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 
2013/12/19 18:52:53,609 [main] - [] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:oracle:thin:@localhost:1521:orcl] 
2013/12/19 18:52:53,647 [main] - [] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - Registering transaction synchronization for JDBC Connection 
2013/12/19 18:52:53,649 [main] - [] DEBUG org.springframework.jdbc.core.metadata.CallMetaDataProviderFactory - Using org.springframework.jdbc.core.metadata.OracleCallMetaDataProvider 
2013/12/19 18:52:53,649 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - Compiled stored procedure. Call string is [{? = call PPV.BROADCASTSHEETMANAGEMENT.TEST(?, ?)}] 
2013/12/19 18:52:53,649 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - SqlCall for function [TEST] compiled 
2013/12/19 18:52:53,651 [main] - [] DEBUG org.springframework.jdbc.core.metadata.CallMetaDataContext - Matching [number2, number1, newChangeSequence] with [number2, newChangeSequence, number1] 
2013/12/19 18:52:53,651 [main] - [] DEBUG org.springframework.jdbc.core.metadata.CallMetaDataContext - Found match for [number2, number1, newChangeSequence] 
2013/12/19 18:52:53,652 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - The following parameters are used for call {? = call PPV.BROADCASTSHEETMANAGEMENT.TEST(?, ?)} with: {number2=20, number1=10, newChangeSequence=0} 
2013/12/19 18:52:53,652 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - 1: newChangeSequence SQL Type 2 Type Name null org.springframework.jdbc.core.SqlParameter 
2013/12/19 18:52:53,652 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - 2: number1 SQL Type 2 Type Name null org.springframework.jdbc.core.SqlParameter 
2013/12/19 18:52:53,652 [main] - [] DEBUG org.springframework.jdbc.core.simple.SimpleJdbcCall - 3: number2 SQL Type 2 Type Name null org.springframework.jdbc.core.SqlParameter 
2013/12/19 18:52:53,653 [main] - [] DEBUG org.springframework.jdbc.core.JdbcTemplate - Calling stored procedure [{? = call PPV.BROADCASTSHEETMANAGEMENT.TEST(?, ?)}] 
2013/12/19 18:52:53,655 [main] - [] DEBUG org.springframework.jdbc.core.JdbcTemplate - CallableStatement.execute() returned 'false' 
2013/12/19 18:52:53,655 [main] - [] DEBUG org.springframework.jdbc.core.JdbcTemplate - CallableStatement.getUpdateCount() returned -1 
Returned changeSequence is: null 

存儲過程的代碼是:

function test(number1 number, number2 number) return number is 
    newChangeSequence number(4); 
begin 
    newChangeSequence:= number1 + number2; 
      return newChangeSequence; 
end test; 

回答

1

你必須使用SqlOutParameter這樣的:

_simpleJdbcCall.declareParameters.declareParameters(new SqlOutParameter("newChangeSequence",java.sql.Types.NUMERIC)); 

,請過帳您的存儲過程代碼。

+1

謝謝斯蒂芬。有效!! – arvindk

+0

我的函數沒有參數,返回類型是clob。返回參數有 沒有名稱: 功能getHeadData RETURN clob IS ... END; ' 如何申報? 我嘗試: 調用declareParameter(新SqlOutParameter( 「1」,Types.CLOB),但該消息是: CallableStatementCallback;對於SQL未經歸類的SQLException [{呼叫{=調用 getHeadData()}()?}]; SQL狀態[99999];錯誤代碼[17041]; Fehlender IN-OUT OUT參數索引:: 2; 任何建議? – SzB

相關問題