2009-05-14 3 views
7

Ich verwende Spring Persistence Framework für mein Projekt. Ich möchte Oracle-Funktion oder gespeicherte Prozedur von diesem Framework aufrufen.Wie Oracle-Funktion oder gespeicherte Prozedur mit Feder Persistenz-Framework aufrufen?

Kann mir jemand vorschlagen, wie ich das erreichen kann.

Bitte geben Sie eine Lösung für beide * Orakel-Funktion und * gespeicherte Prozedur.

Danke.

+0

Frühling hat eine Persistenz-Framework? Beziehen Sie sich auf Spring JdbcTemplate? Oder Hibernate? –

+0

Ich habe DPTK verwendet, um Persistence Framework und Spring's Query Factory zu erstellen. Jetzt möchten Sie Oracle-Funktion oder gespeicherte Prozedur mit vorhandenen Funktionen aufrufen, können Sie mir helfen, dies zu sortieren. –

+0

DPTK scheint ein IBM-Produkt zu sein: http://www.alphaworks.ibm.com/tech/dptk –

Antwort

32

Sie Unter der Annahme, beziehen sich auf JdbcTemplate:

jdbcTemplate.execute(
    new CallableStatementCreator() { 
     public CallableStatement createCallableStatement(Connection con) throws SQLException{ 
      CallableStatement cs = con.prepareCall("{call MY_STORED_PROCEDURE(?, ?, ?)}"); 
      cs.setInt(1, ...); // first argument 
      cs.setInt(2, ...); // second argument 
      cs.setInt(3, ...); // third argument 
      return cs; 
     } 
    }, 
    new CallableStatementCallback() { 
     public Object doInCallableStatement(CallableStatement cs) throws SQLException{ 
      cs.execute(); 
      return null; // Whatever is returned here is returned from the jdbcTemplate.execute method 
     } 
    } 
); 

Aufruf einer Funktion ist fast identisch:

jdbcTemplate.execute(
    new CallableStatementCreator() { 
     public CallableStatement createCallableStatement(Connection con) { 
      CallableStatement cs = con.prepareCall("{? = call MY_FUNCTION(?, ?, ?)}"); 
      cs.registerOutParameter(1, Types.INTEGER); // or whatever type your function returns. 
      // Set your arguments 
      cs.setInt(2, ...); // first argument 
      cs.setInt(3, ...); // second argument 
      cs.setInt(4, ...); // third argument 
      return cs; 
     } 
    }, 
    new CallableStatementCallback { 
     public Object doInCallableStatement(CallableStatement cs) { 
      cs.execute(); 
      int result = cs.getInt(1); 
      return result; // Whatever is returned here is returned from the jdbcTemplate.execute method 
     } 
    } 
); 
+0

Hier rufen wir SP an, wie können wir Oracle Function aufrufen ... Ich beziehe mich nicht auf JdbcTemplate, ich denke an Persistence Framework mit DPTK .. –

+0

Das zweite Beispiel ruft eine Funktion auf. Leider kenne ich DPTK nicht. Hat es eine Website? –

+0

okay, ich werde versuchen, dies mit meinem Code zu implementieren ... hoffe, es wird funktionieren..Danke Adam, lassen Sie wissen, das Ergebnis .. –

17

Einfachere Weg, um eine Oracle-Funktion im Frühjahr Aufruf wird Subklassen StoredProcedure wie unter

public class MyStoredProcedure extends StoredProcedure{ 
    private static final String SQL = "package.function"; 

    public MyStoredProcedure(DataSource ds){ 
     super(ds,SQL); 
     declareParameter(new SqlOutParameter("param_out",Types.NUMERIC)); 
     declareParameter(new SqlParameter("param_in",Types.NUMERIC)); 
     setFunction(true);//you must set this as it distinguishes it from a sproc 
     compile(); 
    } 

    public String execute(Long rdsId){ 
     Map in = new HashMap(); 
     in.put("param_in",rdsId); 
     Map out = execute(in); 
     if(!out.isEmpty()) 
      return out.get("param_out").toString(); 
     else 
      return null; 
    } 
} 

Und nennen Sie es so

@Autowired DataSource ds; 
MyStoredProcedure sp = new MyStoredProcedure(ds); 
String i = sp.execute(1l); 

Die hier verwendete Oracle-Funktion nimmt nur einen numerischen Parameter und gibt einen numerischen Parameter zurück.

+0

wie ich verstehe, sollte der SQL-Code wie folgt aussehen: '{: param_out = Aufruf schema.package.MY_FUNCTION (: param_in)}' – mmoossen

+0

mein letzter Kommentar ist falsch. Die SQL-Konstante muss nur den Prozedur-/Funktionsnamen wie 'schema.package.MY_FUNCTION' und die Parameternamen in Java ** HAVE ** enthalten, damit sie mit den Parameternamen übereinstimmen, die in der Prozedur/Funktion definiert sind. – mmoossen

0

Meiner Meinung nach ist dies eine der einfachsten Methoden:

public class ServRepository { 

    private JdbcTemplate jdbcTemplate; 
    private SimpleJdbcCall functionGetServerErrors; 

    @Autowired 
    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
     JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
     jdbcTemplate.setResultsMapCaseInsensitive(true); 
     this.functionGetServerErrors = new SimpleJdbcCall(jdbcTemplate).withFunctionName("THIS_IS_YOUR_DB_FUNCTION_NAME").withSchemaName("OPTIONAL_SCHEMA_NAME"); 
    } 

     public String callYourFunction(int parameterOne, int parameterTwo) { 
      SqlParameterSource in = new MapSqlParameterSource().addValue("DB_FUNCTION_INCOMING_PARAMETER_ONE", parameterOne).addValue("DB_FUNCTION_INCOMING_PARAMETER_TWO", parameterTwo); 
      return functionGetServerErrors.executeFunction(String.class, in); 
     } 
} 
Verwandte Themen