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

Procedimientos almacenados JDBC

Mientras aprendíamosJDBC-sentenciaMientras aprendíamos un capítulo, también aprendimos cómo usar procedimientos almacenados en JDBC. Este capítulo es similar a ese capítulo, pero le proporcionará más información sobre la sintaxis de escape de SQL en JDBC.

Al igual que el objeto Connection crea objetos Statement y PreparedStatement, también crea objetos CallableStatement, que se utilizarán para ejecutar llamadas a procedimientos almacenados en la base de datos.

Crear objeto CallableStatement

Supongamos que necesita ejecutar el siguiente procedimiento almacenado de 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;
FIN;

NOTA: La función almacenada ya está escrita para Oracle, pero estamos utilizando una base de datos MySQL, por lo tanto, escribamos el mismo procedimiento almacenado para MySQL, como se muestra a continuación, para crearlo en la base de datos 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 ;

Existen tres tipos de parámetros: IN, OUT e INOUT. Los objetos PreparedStatement solo utilizan parámetros IN. Los objetos CallableStatement pueden usar todos estos tres tipos.

Esta es la definición de cada uno-

RangoDescripción
IN

Parámetros cuyos valores no se conocen al crear la sentencia SQL. Enlazar valores a los parámetros IN usando el método setXXX().

OUT

Su valor es proporcionado por el parámetro proporcionado por la sentencia SQL devuelta. Recupere valores de los parámetros OUT usando el método getXXX().

INOUT

Proporciona parámetros con valores de entrada y salida. Puede enlazar variables usando el método setXXX() y recuperar valores usando el método getXXX().

El siguiente fragmento de código muestra cómo instanciar el objeto utilizando este método basado en el procedimiento almacenado anterior-Connection.prepareCall()CallableStatement

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

La variable de cadena SQL representa el procedimiento almacenado con marcadores de posición de parámetros.

El uso del objeto CallableStatement es muy similar al uso del objeto PreparedStatement. Debe enlazar los valores a todos los parámetros antes de ejecutar la sentencia; de lo contrario, recibirá una SQLException.

Si hay parámetros IN, simplemente siga las mismas reglas y técnicas aplicables a los objetos PreparedStatement; use el método setXXX() correspondiente al tipo de datos Java asociado.

Cuando se usan parámetros OUT y INOUT, debe usar el método adicional CallableStatement registerOutParameter(). El método registerOutParameter() une el tipo de datos JDBC al tipo de datos esperado del procedimiento almacenado devuelto.

Después de llamar al procedimiento almacenado, puede usar el método getXXX() adecuado para recuperar valores de los parámetros OUT. Este método convierte el valor de tipo SQL obtenido en tipo de datos Java.

Cerrar el objeto CallableStatement

Al igual que con otros objetos Statement, también debe cerrar el objeto CallableStatement por las mismas razones.

Basta con llamar al método close(). Si cierra primero el objeto Connection, también cerrará el objeto CallableStatement. Sin embargo, debe cerrar explícitamente el objeto CallableStatement para asegurarse de que se limpie correctamente.

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

Estudiamos enEn el código de ejemplo llamativoSe estudiaron más detalles.

Gramática de escape JDBC SQL

La gramática de escape le permite usar características específicas de la base de datos que no pueden usarse con métodos y atributos estándar de JDBC.
El formato de la gramática de escape SQL general es el siguiente-

{keyword 'parámetros'}

A continuación se presentan las siguientes secuencias de escape, que encontrará muy útiles en la programación JDBC-

palabras clave d, t, ts

Pueden ayudar a identificar textos de fecha, hora y marca de tiempo. Como usted sabe, no dos dbms representan de la misma manera la fecha y la hora. Esta gramática de escape informa al driver de que presente la fecha o la hora en el formato del banco de datos objetivo. Por ejemplo:

{d 'yyyy-mm-dd'}

donde yyyy = año, mm = mes; dd = día. Utilice esta gramática {d'2009-09-03es2009año3mes9día.

Este es un ejemplo simple que muestra cómo insertar una fecha en una tabla-

//Crear un objeto Statement
stmt = conn.createStatement();
//Insertar datos ==> ID, Nombre, Apellido, DOB
String sql = "INSERT INTO STUDENTS VALUES" +
             "(100, 'Zara', 'Ali', {d '2001-12-16'})";
stmt.executeUpdate(sql);

Del mismo modo, puede usar una de las siguientes dos gramáticas:tots

{t 'hh:mm:ss'}

donde hh = hora; mm = minuto; ss = segundo. Utilice esta gramática {t '13:30:29es1:30:29 PM.

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

Esta es la combinación de las dos gramáticas anteriores, donde 'd' y 't' representan marcas de tiempo.

palabra clave escape

Este carácter de escape identifica el carácter de escape utilizado en la cláusula LIKE. Es muy útil al usar el carácter de comodín % de SQL, que coincide con cero o más caracteres. Por ejemplo:

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

Si se utiliza el carácter de escape (\) como carácter de escape, también debe usarse dos caracteres de escape en el literal de cadena Java String, porque el carácter de escape también es un carácter de escape en Java.

palabra clave fn

Esta palabra clave representa las funciones escalares utilizadas en el DBMS. Por ejemplo, puede usar funciones SQLlongitudpara obtener la longitud de la cadena-

{fn length('Hello World')}

Esto devolverá11es decir, la longitud de la cadena "Hello World".

palabra clave call

Esta palabra clave se utiliza para llamar a procedimientos almacenados. Por ejemplo, para procedimientos almacenados que necesitan parámetros IN, utilice la siguiente sintaxis-

{call my_procedure(?)};

Para los procedimientos almacenados que necesitan parámetros IN y devuelven parámetros OUT, utilice la siguiente sintaxis-

{? = call my_procedure(?)};

palabra clave oj

Esta palabra clave se utiliza para representar la unión externa. La sintaxis es la siguiente-

{oj outer-join}

donde, la unión externa = tabla {LEFT | RIGHT | FULL} OUTERJOIN {tabla | condiciones de búsqueda. Por ejemplo-

String sql = "SELECT Employees 
              FROM {oj ThisTable RIGHT
              UNION EXTERNA ThatTable en id =100'}";
stmt.execute(sql);