Redatto

  • al 30.06.2009
  • alle 09:08 AM
  • da Marco

Java e le Stored Procedure di Oracle 1

Con questo articolo voglio mostrare come Java interagisce con le stored procedure di Oracle.

Ricordo che una stored procedure non è altro che un pezzo di codice scritto solitamente con un linguaggio propretario del DBMS (PL/SQL nel caso di Oracle) e memorizzato nel database stesso, in quello che viene chiamato database data dictionary, che permette di effettuare operazioni di qualunque genere sul database stesso e sui dati in esso contenuti.

In particolare le stored procedure si classificano in tre differenti categorie:

  • funzioni: simili a quelle che sono le funzioni di un linguazzio di programmazione procedurale con dei parametri di ingresso e un valore opzionale di ritorno.
  • procedure: sono simili alle funzioni ma non hanno un valore di ritorno bensì molteplici dati in ingresso e uscita.
  • trigger: sono porzioni di codice che vengono eseguite conseguentemente a degli eventi generati dal database.

Detto questo vediamo come definire una funzione di prova, come questa può essere eseguita in Java e come può essere letto il valore di ritorno:

CREATE OR REPLACE FUNCTION test_function
(
  AAA IN NUMBER,
  BBB IN NUMBER,
  CCC IN NUMBER
)
RETURN NUMBER
AS
  DDD NUMBER := 6;
BEGIN
  RETURN DDD;
END;
./

La funzione creata è molto semplice e restituisce sempre 6 a prescindere dal valore dei parametri in ingresso. Vediamo come la funzione test_function può essere richiamata in Java.

public int getDDD(int aaa, int bbb, int ccc)
     throws SQLException {		

  int ddd = 0;

  Connection cn = null;
  ResultSet rs = null;
  Statement stmt = null;

  try {
    String sql = "select test_function(" +
        aaa + "," +
        bbb + "," +
        ccc + ") from dual";

    cn = getConnection();
    stmt = cn.createStatement();
    rs = stmt.executeQuery(sql);

    while(rs.next())
      ddd += rs.getInt(1);
  }
  finally {
    if(stmt != null)
      stmt.close();
    if(rs != null)
      rs.close();
    if(cn != null)
      cn.close();
  }

  return ddd;
}

Come vedete è molto semplice e non differisce molto da una qualunque sql select. Potete inoltre utilizzare il PrepareStatement al posto del normale Statement facendo il binding dei parametri in ingresso alla funzione.

Definiamo ora una procedura e analizziamo come richiamarla in Java:

CREATE OR REPLACE PROCEDURE test_procedure
(
  AAA IN NUMBER,
  BBB IN NUMBER,
  CCC IN NUMBER,
  DDD OUT VARCHAR2,
  EEE OUT NUMBER
)
BEGIN
  DDD: = 'TEST';
  EEE: = 6;
END;
./

Anche la procedura creata è molto semplice e accettando tre parametri di ingresso di tipo numerico ne restituisce due in uscita sempre valorizzati con  DDD pari alla strings TEST  e EEE pari a 6. Vediamo ora come si può richiamare questa procedura in Java:

public void printProcedureResults(int aaa, int bbb, int ccc)
    throws SQLException {		

  String ddd = null;
  int eee = 0;  

  Connection cn = null;
  CallableStatement cs = null;

  try {

    String store =
      "{ call WPO.RILEVA_PROGRAMMAZIONE(?, ?, ?, ?, ?) }";

    cn = getConnection();
    cs = cn.prepareCall(store);

    //setta i parametri di input
    cs.setInt(1, aaa);
    cs.setInt(2, bbb);
    cs.setInt(3, ccc);            

    //setta i tipi di parametri di output
    cs.registerOutParameter(4, java.sql.Types.VARCHAR);
    cs.registerOutParameter(5, java.sql.Types.INTEGER);

    cs.execute();

    //legge i parametri di output
    ddd = cs.getString(4);
    eee = cs.getInt(5);
  }
  finally {
    if(cs != null)
      cs.close();
    if(cn != null)
      cn.close();
  }

  System.out.println("ddd: " + ddd);
  System.out.println("eee: " + eee);
}

Anche questo metodo non è molto complesso, si nota l’uso dell’oggetto CallableStatement che serve proprio per richiamare le stored procedure. Viene inoltre  richiamato per definire la tipologia dei parametri che la procedura restituirà in output il metodo di CallableStatement registerOutParameter al quale viene passata oltre alla posizione del parametro anche la tipologia Oracle relativa.

In entrambi i metodi presentati è stata volontariamente omessa la parte di procacciamento della connessione in quanto non voleva essere oggetto di questo articolo. L’implementazione del metodo getConnection è lasciata a voi lettori a seconda delle vostre esigenze ;)

Articoli simili

subscribe to comments RSS

Un commento per questo post

  1. kaxpac scrive:

    oucroxptpqrmdulilobukykbfhwwjw

Sentiti libero di lasciare il tuo commento

* campi obbligatori

IT c.s.p. usa una versione modificata di FREEmium Theme.
Politiche sulla privacy - Copyright