JDBC - Gespeicherte Prozedur

Wir haben gelernt, wie man es benutzt Stored Proceduresin JDBC, während das Kapitel JDBC - Anweisungen besprochen wird. Dieses Kapitel ähnelt diesem Abschnitt, enthält jedoch zusätzliche Informationen zur JDBC-SQL-Escape-Syntax.

So wie ein Connection-Objekt die Statement- und PreparedStatement-Objekte erstellt, erstellt es auch das CallableStatement-Objekt, mit dem ein Aufruf einer gespeicherten Datenbankprozedur ausgeführt wird.

CallableStatement-Objekt erstellen

Angenommen, Sie müssen die folgende gespeicherte Oracle-Prozedur ausführen:

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: Die oben gespeicherte Prozedur wurde für Oracle geschrieben, aber wir arbeiten mit der MySQL-Datenbank. Schreiben wir also dieselbe gespeicherte Prozedur für MySQL wie folgt, um sie in der EMP-Datenbank zu erstellen.

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 ;

Es gibt drei Arten von Parametern: IN, OUT und INOUT. Das PreparedStatement-Objekt verwendet nur den Parameter IN. Das CallableStatement-Objekt kann alle drei verwenden.

Hier sind die Definitionen von jedem -

Parameter Beschreibung
IM Ein Parameter, dessen Wert beim Erstellen der SQL-Anweisung unbekannt ist. Sie binden Werte mit den Methoden setXXX () an IN-Parameter.
AUS Ein Parameter, dessen Wert von der zurückgegebenen SQL-Anweisung bereitgestellt wird. Sie rufen Werte aus den OUT-Parametern mit den Methoden getXXX () ab.
INOUT Ein Parameter, der sowohl Eingabe- als auch Ausgabewerte bereitstellt. Sie binden Variablen mit den Methoden setXXX () und rufen Werte mit den Methoden getXXX () ab.

Das folgende Codefragment zeigt, wie das verwendet wird Connection.prepareCall() Methode zur Instanziierung a CallableStatement Objekt basierend auf der vorhergehenden gespeicherten Prozedur -

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

Die String-Variable SQL repräsentiert die gespeicherte Prozedur mit Parameterplatzhaltern.

Die Verwendung von CallableStatement-Objekten ähnelt der Verwendung von PreparedStatement-Objekten. Sie müssen Werte an alle Parameter binden, bevor Sie die Anweisung ausführen. Andernfalls erhalten Sie eine SQLException.

Wenn Sie IN-Parameter haben, befolgen Sie einfach dieselben Regeln und Techniken, die für ein PreparedStatement-Objekt gelten. Verwenden Sie die Methode setXXX (), die dem zu bindenden Java-Datentyp entspricht.

Wenn Sie die Parameter OUT und INOUT verwenden, müssen Sie eine zusätzliche CallableStatement-Methode verwenden, registerOutParameter (). Die Methode registerOutParameter () bindet den JDBC-Datentyp an den Datentyp, den die gespeicherte Prozedur voraussichtlich zurückgeben wird.

Sobald Sie Ihre gespeicherte Prozedur aufrufen, rufen Sie den Wert mit der entsprechenden Methode getXXX () aus dem Parameter OUT ab. Diese Methode wandelt den abgerufenen Wert des SQL-Typs in einen Java-Datentyp um.

CallableStatement-Objekt schließen

Genau wie Sie ein anderes Anweisungsobjekt schließen, sollten Sie aus demselben Grund auch das CallableStatement-Objekt schließen.

Ein einfacher Aufruf der Methode close () erledigt den Job. Wenn Sie das Verbindungsobjekt zuerst schließen, wird auch das CallableStatement-Objekt geschlossen. Sie sollten das CallableStatement-Objekt jedoch immer explizit schließen, um eine ordnungsgemäße Bereinigung sicherzustellen.

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

StudieWir haben weitere Details im Callable - Beispielcode untersucht .

JDBC SQL Escape Syntax

Die Escape-Syntax bietet Ihnen die Flexibilität, datenbankspezifische Funktionen zu verwenden, die Ihnen mithilfe von Standard-JDBC-Methoden und -Eigenschaften nicht zur Verfügung stehen.

Das allgemeine SQL-Escape-Syntaxformat lautet wie folgt:

{keyword 'parameters'}

Hier sind die folgenden Escape-Sequenzen, die Sie beim Ausführen der JDBC-Programmierung sehr nützlich finden würden:

d, t, ts Schlüsselwörter

Sie helfen bei der Identifizierung von Datums-, Uhrzeit- und Zeitstempelliteralen. Wie Sie wissen, repräsentieren keine zwei DBMS Uhrzeit und Datum auf dieselbe Weise. Diese Escape-Syntax weist den Treiber an, Datum und Uhrzeit im Format der Zieldatenbank zu rendern. Zum Beispiel -

{d 'yyyy-mm-dd'}

Wobei JJJJ = Jahr, MM = Monat; dd = Datum. Die Verwendung dieser Syntax {d '2009-09-03'} ist der 9. März 2009.

Hier ist ein einfaches Beispiel, das zeigt, wie ein Datum in eine Tabelle eingefügt wird.

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

Ebenso können Sie eine der folgenden beiden Syntaxen verwenden t oder ts - -

{t 'hh:mm:ss'}

Wobei hh = Stunde; mm = Minute; ss = Sekunde. Bei Verwendung dieser Syntax ist {t '13: 30: 29 '} 13:30:29 Uhr.

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

Dies ist eine kombinierte Syntax der beiden oben genannten Syntax für 'd' und 't' zur Darstellung des Zeitstempels.

Escape-Schlüsselwort

Dieses Schlüsselwort identifiziert das in LIKE-Klauseln verwendete Escape-Zeichen. Nützlich bei Verwendung des SQL-Platzhalters%, der null oder mehr Zeichen entspricht. Zum Beispiel -

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

Wenn Sie das Backslash-Zeichen (\) als Escape-Zeichen verwenden, müssen Sie in Ihrem Java-String-Literal auch zwei Backslash-Zeichen verwenden, da der Backslash auch ein Java-Escape-Zeichen ist.

fn Schlüsselwort

Dieses Schlüsselwort repräsentiert Skalarfunktionen, die in einem DBMS verwendet werden. Zum Beispiel können Sie SQL - Funktion verwenden Länge die Länge einer Zeichenfolge zu erhalten -

{fn length('Hello World')}

Dies gibt 11 zurück, die Länge der Zeichenkette 'Hello World'.

Schlüsselwort aufrufen

Mit diesem Schlüsselwort werden die gespeicherten Prozeduren aufgerufen. Verwenden Sie beispielsweise für eine gespeicherte Prozedur, für die ein IN-Parameter erforderlich ist, die folgende Syntax:

{call my_procedure(?)};

Verwenden Sie für eine gespeicherte Prozedur, die einen IN-Parameter erfordert und einen OUT-Parameter zurückgibt, die folgende Syntax:

{? = call my_procedure(?)};

oj Schlüsselwort

Dieses Schlüsselwort wird verwendet, um äußere Verknüpfungen zu kennzeichnen. Die Syntax lautet wie folgt:

{oj outer-join}

Wobei Outer-Join = Tabelle {LINKS | RECHTS | VOLL} OUTERJOIN {Tabelle | Outer-Join} unter Suchbedingungen. Zum Beispiel -

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