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







oucroxptpqrmdulilobukykbfhwwjw