JDBC - Stored procedure
Abbiamo imparato a usare Stored Proceduresin JDBC mentre si discute del capitolo JDBC - Dichiarazioni . Questo capitolo è simile a quella sezione, ma fornisce ulteriori informazioni sulla sintassi di escape SQL JDBC.
Proprio come un oggetto Connection crea gli oggetti Statement e PreparedStatement, crea anche l'oggetto CallableStatement, che verrebbe utilizzato per eseguire una chiamata a una stored procedure di database.
Creazione dell'oggetto CallableStatement
Supponiamo di dover eseguire la seguente procedura memorizzata Oracle:
CREATE OR REPLACE PROCEDURE getEmpName
(EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END;
NOTE: La procedura memorizzata sopra è stata scritta per Oracle, ma stiamo lavorando con il database MySQL quindi, scriviamo la stessa procedura memorizzata per MySQL come segue per crearla nel database EMP -
DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName`
(IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END $$
DELIMITER ;
Esistono tre tipi di parametri: IN, OUT e INOUT. L'oggetto PreparedStatement utilizza solo il parametro IN. L'oggetto CallableStatement può utilizzare tutti e tre.
Ecco le definizioni di ciascuno -
Parametro | Descrizione |
---|---|
IN | Un parametro il cui valore è sconosciuto quando viene creata l'istruzione SQL. Associare i valori ai parametri IN con i metodi setXXX (). |
SU | Un parametro il cui valore viene fornito dall'istruzione SQL che restituisce. I valori vengono recuperati dai parametri OUT con i metodi getXXX (). |
DENTRO FUORI | Un parametro che fornisce valori di input e output. Associate le variabili con i metodi setXXX () e recuperate i valori con i metodi getXXX (). |
Il frammento di codice seguente mostra come utilizzare Connection.prepareCall() metodo per istanziare un file CallableStatement oggetto basato sulla procedura memorizzata precedente -
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
La variabile SQL String rappresenta la stored procedure, con segnaposto di parametro.
L'utilizzo di oggetti CallableStatement è molto simile all'utilizzo di oggetti PreparedStatement. È necessario associare i valori a tutti i parametri prima di eseguire l'istruzione, altrimenti si riceverà una SQLException.
Se hai parametri IN, segui le stesse regole e tecniche che si applicano a un oggetto PreparedStatement; utilizzare il metodo setXXX () che corrisponde al tipo di dati Java che si sta collegando.
Quando si utilizzano i parametri OUT e INOUT, è necessario utilizzare un metodo CallableStatement aggiuntivo, registerOutParameter (). Il metodo registerOutParameter () collega il tipo di dati JDBC al tipo di dati che la procedura memorizzata dovrebbe restituire.
Dopo aver chiamato la procedura memorizzata, si recupera il valore dal parametro OUT con il metodo getXXX () appropriato. Questo metodo esegue il cast del valore recuperato del tipo SQL su un tipo di dati Java.
Chiusura dell'oggetto CallableStatement
Proprio come chiudi un altro oggetto Statement, per lo stesso motivo dovresti chiudere anche l'oggetto CallableStatement.
Una semplice chiamata al metodo close () farà il lavoro. Se chiudi prima l'oggetto Connection, chiuderà anche l'oggetto CallableStatement. Tuttavia, dovresti sempre chiudere in modo esplicito l'oggetto CallableStatement per garantire una corretta pulizia.
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
cstmt.close();
}
studio Abbiamo studiato più dettagli nel Callable - Codice di esempio .
Sintassi JDBC SQL Escape
La sintassi di escape offre la flessibilità di utilizzare le funzionalità specifiche del database non disponibili utilizzando metodi e proprietà JDBC standard.
Il formato della sintassi di escape SQL generale è il seguente:
{keyword 'parameters'}
Ecco le seguenti sequenze di escape, che potresti trovare molto utili durante l'esecuzione della programmazione JDBC:
d, t, ts Parole chiave
Aiutano a identificare i valori letterali di data, ora e timestamp. Come sapete, non esistono due DBMS che rappresentano l'ora e la data allo stesso modo. Questa sintassi di escape indica al driver di eseguire il rendering della data o dell'ora nel formato del database di destinazione. Ad esempio -
{d 'yyyy-mm-dd'}
Dove yyyy = anno, mm = mese; dd = data. L'utilizzo di questa sintassi {d '2009-09-03'} è il 9 marzo 2009.
Ecco un semplice esempio che mostra come INSERIRE la data in una tabella:
//Create a Statement object
stmt = conn.createStatement();
//Insert data ==> ID, First Name, Last Name, DOB
String sql="INSERT INTO STUDENTS VALUES" +
"(100,'Zara','Ali', {d '2001-12-16'})";
stmt.executeUpdate(sql);
Allo stesso modo, puoi usare anche una delle due seguenti sintassi t o ts -
{t 'hh:mm:ss'}
Dove hh = ora; mm = minuto; ss = secondo. Utilizzando questa sintassi {t '13: 30: 29 '} è 1:30:29 PM.
{ts 'yyyy-mm-dd hh:mm:ss'}
Questa è la sintassi combinata delle due sintassi precedenti per "d" e "t" per rappresentare il timestamp.
parola chiave di escape
Questa parola chiave identifica il carattere di escape utilizzato nelle clausole LIKE. Utile quando si utilizza il carattere jolly SQL%, che corrisponde a zero o più caratteri. Ad esempio:
String sql = "SELECT symbol FROM MathSymbols
WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);
Se si utilizza il carattere barra rovesciata (\) come carattere di escape, è necessario utilizzare anche due caratteri barra rovesciata nella stringa letterale Java, poiché anche la barra rovesciata è un carattere di escape Java.
fn Parola chiave
Questa parola chiave rappresenta le funzioni scalari utilizzate in un DBMS. Ad esempio, puoi usare la funzione SQL length per ottenere la lunghezza di una stringa -
{fn length('Hello World')}
Restituisce 11, la lunghezza della stringa di caratteri "Hello World".
chiama parola chiave
Questa parola chiave viene utilizzata per chiamare le stored procedure. Ad esempio, per una stored procedure che richiede un parametro IN, utilizzare la seguente sintassi:
{call my_procedure(?)};
Per una procedura memorizzata che richiede un parametro IN e restituisce un parametro OUT, utilizzare la sintassi seguente:
{? = call my_procedure(?)};
oj Parola chiave
Questa parola chiave viene utilizzata per indicare i join esterni. La sintassi è la seguente:
{oj outer-join}
Dove outer-join = table {LEFT | RIGHT | FULL} OUTERJOIN {table | outer-join} sulla condizione di ricerca. Ad esempio:
String sql = "SELECT Employees
FROM {oj ThisTable RIGHT
OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);