2016-06-07 33 views
0

我有以下Oracle PL/SQL調用,它工作完全正常:擴展Spring的StoredProcedure有IN和OUT參數

declare 
    dummy number; 
begin 
    my.proc(a => 89561, 
      b => 1, 
      c => 1, 
      d => '', 
      e => 1, 
      f => 1, 
      g => 1, 
      h => 1, 
      i => 1, 
      j => 1, 
      k => 1, 
      l => 1, 
      m => 1, 
      n => 1, 
      o => 1, 
      p => 1, 
      q => dummy); 
end; 

我想以編程方式調用它,爲了這個,我創建的延伸組織的類。 springframework.jdbc.object.StoredProcedure。類如下:

import java.util.HashMap; 
import java.util.Map; 
import javax.sql.DataSource; 
import org.springframework.jdbc.object.StoredProcedure; 

public class MySP extends StoredProcedure { 

    private static final String PROC_NAME = "my.proc"; 

    public MySP(DataSource ds) { 
     super(ds,PROC_NAME); 
     compile(); 
    } 

    public void execute() { 
     Map<String, Object> params = new HashMap<>(); 
     params.put("a", 89561L); 
     params.put("b", 1L); 
     params.put("c", 1L); 
     params.put("d", ""); 
     params.put("e", 1L); 
     params.put("f", 1L); 
     params.put("g", 1L); 
     params.put("h", 1L); 
     params.put("i", 1L); 
     params.put("j", 1L); 
     params.put("k", 1L); 
     params.put("l", 1L); 
     params.put("m", 1L); 
     params.put("n", 1L); 
     params.put("o", 1L); 
     params.put("p", 1L); 
     params.put("q", 0L); 
     super.execute(params); 
    } 
} 

當我運行他的代碼,我在歌廳以下Oracle錯誤:

PLS-00306:錯號碼或類型的呼叫「PROC」

參數

我敢肯定,錯誤來自我傳遞「q」參數的方式......但無法找到另一種傳遞方式。

有什麼想法?

回答

2

彈簧StoredProcedure要求您聲明您要傳遞的參數的類型。看下面的例子。

public class MySP extends StoredProcedure { 
    private static final String PROC_NAME = "my.proc"; 

    public MySP(DataSource ds) { 
     super(ds,PROC_NAME); 

     //declaraction of parameters 
     declareParameter(new SqlParameter("x", java.sql.Types.NUMERIC)); 
     declareParameter(new SqlOutParameter("y", java.sql.Types.VARCHAR)); 
     declareParameter(new SqlInOutParameter("z", java.sql.Types.VARCHAR)); 
    } 
    public void execute() { 
     Map<String, Object> params = new HashMap<>(); 
     params.put("x", 89561L); 
     params.put("y", 1L); 
     params.put("z", 1L); 

     super.execute(params); 
    } 

}