JDBC - Procédure stockée

Nous avons appris à utiliser Stored Proceduresdans JDBC tout en discutant du chapitre JDBC - Déclarations . Ce chapitre est similaire à cette section, mais il vous donnera des informations supplémentaires sur la syntaxe d'échappement SQL JDBC.

Tout comme un objet Connection crée les objets Statement et PreparedStatement, il crée également l'objet CallableStatement, qui serait utilisé pour exécuter un appel à une procédure stockée de base de données.

Création d'un objet CallableStatement

Supposons que vous deviez exécuter la procédure stockée Oracle suivante -

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 procédure stockée ci-dessus a été écrite pour Oracle, mais nous travaillons avec la base de données MySQL donc, écrivons la même procédure stockée pour MySQL comme suit pour la créer dans la base de données 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 ;

Il existe trois types de paramètres: IN, OUT et INOUT. L'objet PreparedStatement utilise uniquement le paramètre IN. L'objet CallableStatement peut utiliser les trois.

Voici les définitions de chacun -

Paramètre La description
DANS Un paramètre dont la valeur est inconnue lors de la création de l'instruction SQL. Vous liez les valeurs aux paramètres IN avec les méthodes setXXX ().
EN DEHORS Un paramètre dont la valeur est fournie par l'instruction SQL qu'il renvoie. Vous récupérez les valeurs des paramètres OUT avec les méthodes getXXX ().
INOUT Un paramètre qui fournit à la fois des valeurs d'entrée et de sortie. Vous liez des variables avec les méthodes setXXX () et récupérez les valeurs avec les méthodes getXXX ().

L'extrait de code suivant montre comment utiliser le Connection.prepareCall() méthode pour instancier un CallableStatement objet basé sur la procédure stockée précédente -

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

La variable String SQL représente la procédure stockée, avec des espaces réservés de paramètre.

L'utilisation d'objets CallableStatement ressemble beaucoup à l'utilisation d'objets PreparedStatement. Vous devez lier des valeurs à tous les paramètres avant d'exécuter l'instruction, sinon vous recevrez une exception SQLException.

Si vous avez des paramètres IN, suivez simplement les mêmes règles et techniques qui s'appliquent à un objet PreparedStatement; utilisez la méthode setXXX () qui correspond au type de données Java que vous liez.

Lorsque vous utilisez les paramètres OUT et INOUT, vous devez utiliser une méthode CallableStatement supplémentaire, registerOutParameter (). La méthode registerOutParameter () lie le type de données JDBC au type de données que la procédure stockée est censée renvoyer.

Une fois que vous appelez votre procédure stockée, vous récupérez la valeur du paramètre OUT avec la méthode getXXX () appropriée. Cette méthode convertit la valeur récupérée du type SQL en un type de données Java.

Fermer l'objet CallableStatement

Tout comme vous fermez un autre objet Statement, pour la même raison, vous devez également fermer l'objet CallableStatement.

Un simple appel à la méthode close () fera l'affaire. Si vous fermez d'abord l'objet Connection, il fermera également l'objet CallableStatement. Cependant, vous devez toujours fermer explicitement l'objet CallableStatement pour garantir un nettoyage correct.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

étude Nous avons étudié plus de détails dans Callable - Exemple de code .

Syntaxe JDBC SQL Escape

La syntaxe d'échappement vous donne la flexibilité d'utiliser des fonctionnalités spécifiques à la base de données qui ne vous sont pas disponibles en utilisant les méthodes et propriétés JDBC standard.

Le format général de la syntaxe d'échappement SQL est le suivant:

{keyword 'parameters'}

Voici les séquences d'échappement suivantes, que vous trouverez très utiles lors de l'exécution de la programmation JDBC -

d, t, ts Mots-clés

Ils aident à identifier les littéraux de date, d'heure et d'horodatage. Comme vous le savez, il n'y a pas deux SGBD qui représentent l'heure et la date de la même manière. Cette syntaxe d'échappement indique au pilote de restituer la date ou l'heure au format de la base de données cible. Par exemple -

{d 'yyyy-mm-dd'}

Où aaaa = année, mm = mois; jj = date. L'utilisation de cette syntaxe {d '2009-09-03'} est le 9 mars 2009.

Voici un exemple simple montrant comment INSÉRER la date dans une table -

//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);

De même, vous pouvez utiliser l'une des deux syntaxes suivantes, soit t ou ts -

{t 'hh:mm:ss'}

Où hh = heure; mm = minute; ss = seconde. En utilisant cette syntaxe {t '13: 30: 29 '} est 13:30:29 PM.

{ts 'yyyy-mm-dd hh:mm:ss'}

Il s'agit de la syntaxe combinée des deux syntaxes ci-dessus pour «d» et «t» pour représenter l'horodatage.

mot-clé d'échappement

Ce mot clé identifie le caractère d'échappement utilisé dans les clauses LIKE. Utile lors de l'utilisation du caractère générique SQL%, qui correspond à zéro ou plusieurs caractères. Par exemple -

String sql = "SELECT symbol FROM MathSymbols
              WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);

Si vous utilisez le caractère anti-slash (\) comme caractère d'échappement, vous devez également utiliser deux caractères anti-slash dans votre chaîne de caractères Java, car la barre oblique inverse est également un caractère d'échappement Java.

Mot-clé fn

Ce mot clé représente des fonctions scalaires utilisées dans un SGBD. Par exemple, vous pouvez utiliser la longueur de la fonction SQL pour obtenir la longueur d'une chaîne -

{fn length('Hello World')}

Cela renvoie 11, la longueur de la chaîne de caractères «Hello World».

mot-clé d'appel

Ce mot-clé est utilisé pour appeler les procédures stockées. Par exemple, pour une procédure stockée nécessitant un paramètre IN, utilisez la syntaxe suivante -

{call my_procedure(?)};

Pour une procédure stockée nécessitant un paramètre IN et renvoyant un paramètre OUT, utilisez la syntaxe suivante -

{? = call my_procedure(?)};

oj Mot-clé

Ce mot-clé est utilisé pour désigner les jointures externes. La syntaxe est la suivante -

{oj outer-join}

Où jointure externe = table {LEFT | RIGHT | FULL} OUTERJOIN {table | jointure externe} sur condition de recherche. Par exemple -

String sql = "SELECT Employees 
              FROM {oj ThisTable RIGHT
              OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);