English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

存储过程 JDBC

While learningJDBC-queriesIn the same chapter, we learned how to use stored procedures in JDBC. This chapter is similar to that part, but it will provide you with more information about JDBC SQL escape syntax.

Just like the Connection object creates Statement and PreparedStatement objects, it also creates CallableStatement objects, which are used to execute calls to database stored procedures.

Create CallableStatement object

Assuming you need to execute the following Oracle stored procedure-

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: The above stored procedure is written for Oracle, but we are using MySQL database, so let's write the same stored procedure for MySQL as follows, so that it can be created in the EMP database-

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. Gli oggetti PreparedStatement utilizzano solo i parametri IN. Gli oggetti CallableStatement possono utilizzare tutti e tre i tipi di parametri.

Ecco la definizione di ciascuno di essi-

IntervalloDescrizione
IN

I parametri per i quali il valore è sconosciuto quando si crea la statement SQL. Vincolare i valori ai parametri IN utilizzando i metodi setXXX().

OUT

Il valore è fornito dai parametri forniti dalla statement restituita. Recuperare i valori degli argomenti OUT utilizzando i metodi getXXX().

INOUT

Forniscono contemporaneamente valori di input e output per i parametri. È possibile vincolare le variabili utilizzando i metodi setXXX() e recuperare i valori utilizzando i metodi getXXX().

Il seguente frammento di codice mostra come istanziare l'oggetto utilizzando questo metodo basato sulla stored procedure precedenti-Connection.prepareCall()CallableStatement

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

La variabile di stringa SQL rappresenta la stored procedure con segnaposto per i parametri.

L'uso dell'oggetto CallableStatement è molto simile all'uso dell'oggetto PreparedStatement. È necessario vincolare i valori a tutti i parametri prima di eseguire la statement, altrimenti riceverai un SQLException.

Se ci sono argomenti IN, è sufficiente seguire le stesse regole e tecniche applicate agli oggetti PreparedStatement; utilizzare i metodi setXXX() corrispondenti al tipo di dati Java associato.

Quando si utilizzano argomenti OUT e INOUT, è necessario utilizzare il metodo aggiuntivo CallableStatement registerOutParameter(). Il metodo registerOutParameter() associa il tipo di dati JDBC al tipo di dati atteso restituito dalla stored procedure.

Dopo aver chiamato lo stored procedure, è possibile recuperare i valori degli argomenti OUT utilizzando i metodi getXXX(). Questo metodo converte i valori di tipo SQL in tipo dati Java.

Chiudere l'oggetto CallableStatement

Come per la chiusura degli altri oggetti Statement, per la stessa ragione, dovresti chiudere anche l'oggetto CallableStatement.

Basta chiamare il metodo close(). Se si chiude prima l'oggetto Connection, anche l'oggetto CallableStatement verrà chiuso. Tuttavia, è sempre consigliabile chiudere esplicitamente l'oggetto CallableStatement per garantire una pulizia corretta.

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

Studiamo nel dettaglioEsempi di codice chiamabiliE' stato studiato in dettaglio.

Sintassi di escape JDBC SQL

La sintassi di escape consente di utilizzare caratteristiche specifiche del database che non possono essere utilizzate dai metodi e attributi standard JDBC.
La sintassi di escape SQL generale è la seguente:

{keyword 'parametri'}

Ecco le seguenti sequenze di escape, che troverete molto utili durante lo sviluppo di JDBC:

chiavi d, t, ts

Questi possono aiutare a identificare testi di data, ora e timestamp. Come noto, nessun dbms rappresenta in modo identico data e ora. Questa sintassi di escape informa il driver di presentare la data o l'ora nel formato del database di destinazione. Ad esempio:

{d 'yyyy-mm-dd'}

Dove yyyy = anno, mm = mese; dd = giorno. L'uso di questa sintassi {d '2009-09-03'} è 9 settembre 2009.

Questo è un esempio semplice che mostra come inserire una data in una tabella:

//Creazione di un oggetto Statement
stmt = conn.createStatement();
//Inserisci dati ==> ID, Nome, Cognome, Data di Nascita
String sql="INSERT INTO STUDENTS VALUES" +
             "(100,'Zara','Ali', {d '2001-12-16'})";
stmt.executeUpdate(sql);

Allo stesso modo, è possibile utilizzare una delle due sintassi seguenti:toppurets:

{t 'hh:mm:ss'}

Dove hh = ora; mm = minuto; ss = secondo. L'uso di questa sintassi {t '13:30:29'} è 1:30:29 PM.

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

Questa è la combinazione di sintassi delle due precedenti, dove 'd' e 't' rappresentano il timestamp.

chiave di escape

Questo carattere di escape identifica il carattere di escape utilizzato nella clausola LIKE. È molto utile quando si utilizza il carattere di jolly % di 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 di backslash (\) come carattere di escape, è necessario anche utilizzare due backslash characteri nel Java String literal, perché il backslash è anche un carattere di escape Java.

chiave fn

Questa chiave di ricerca rappresenta le funzioni scalari utilizzate nel DBMS. Ad esempio, è possibile utilizzare la funzione SQL-lunghezzaper ottenere la lunghezza della stringa-

{fn length('Hello World')}

Questo restituirà 11, ossia la lunghezza della stringa "Hello World".

chiave call

Questa chiave di ricerca viene utilizzata per chiamare i procedimenti di archiviazione. Ad esempio, per i procedimenti di archiviazione che richiedono parametri IN, utilizzare la seguente sintassi-

{call my_procedure(?)};

Per i procedimenti di archiviazione che richiedono parametri IN e restituiscono parametri OUT, utilizzare la seguente sintassi-

{? = call my_procedure(?)};

chiave oj

Questa chiave di ricerca viene utilizzata per rappresentare l'esterno unione. La sintassi è come segue-

{oj outer-join}

其中,外部联接 = 表 {LEFT | RIGHT | FULL} OUTER JOIN {table | condizione di ricerca. Ad esempio-

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