Cómo utilizar procedimientos almacenados en proyectos
El objeto CallableStatement proporciona un método para que todos los DBMS llamen a procedimientos almacenados en una forma estándar. Los procedimientos almacenados se almacenan en la base de datos. La llamada al procedimiento almacenado es lo que contiene el objeto CallableStatement. Esta llamada está escrita en sintaxis de escape y se presenta en dos formas: una con un parámetro de resultado y otra sin parámetro de resultado. El parámetro de resultado es el parámetro OUT, que es el valor de retorno del procedimiento almacenado. Ambas formas pueden tener un número variable de parámetros de entrada (parámetros de entrada), de salida (parámetros de salida) o de entrada y salida (parámetros de INOUT). El signo de interrogación se utilizará como marcador de posición para el parámetro.
La sintaxis para llamar a procedimientos almacenados en JDBC es la siguiente. Tenga en cuenta que los corchetes indican que el contenido entre ellos es opcional; los corchetes en sí no forman parte de la sintaxis.
{Nombre del procedimiento que llama [(?, ?,...)]}
La sintaxis del procedimiento que devuelve el parámetro de resultado es:
{ ?=Nombre del procedimiento de llamada [(?, ?,...)]}
La sintaxis de un procedimiento almacenado sin parámetros es similar:
{Nombre del procedimiento de llamada}
En términos generales, las personas que crean objetos CallableStatement deben saber que el DBMS que utilizan admite procedimientos almacenados y saber cuáles son estos procedimientos. Sin embargo, si se requiere una inspección, varios métodos DatabaseMetaData pueden proporcionar dicha información. Por ejemplo, si el DBMS admite la llamada a procedimientos almacenados, el método supportStoredProcedures devolverá verdadero y el método getProcedures devolverá la descripción del procedimiento almacenado. CallableStatement hereda el método Statement (utilizado para procesar declaraciones SQL generales) y el método PreparedStatement (utilizado para procesar parámetros).
Todos los métodos definidos en CallableStatement se utilizan para manejar la parte de salida de los parámetros OUT o INOUT: registre el tipo JDBC de los parámetros OUT (tipo SQL genérico), recupere resultados de estos parámetros o verifique si el retorno El valor es JDBC NULO.
1. Cree un objeto de declaración invocable
El objeto CallableStatement se crea utilizando el método de conexión prepareCall. El siguiente ejemplo crea una instancia de CallableStatement que contiene una llamada al procedimiento almacenado getTestData. El procedimiento tiene dos variables, pero ningún parámetro de resultado:
instrucción invocable cs TMT = con prepare call(" { call gettest data(?, ?)}");
in. ? Si el marcador de posición es un parámetro IN, OUT o INOUT depende del procedimiento almacenado getTestData.
2. Parámetros de entrada y salida
El paso del parámetro in al objeto CallableStatement se completa mediante el método setXXX. Este método hereda de PreparedStatement. El tipo de parámetros pasados determina el método setXXX utilizado (por ejemplo, use setFloat para pasar valores de punto flotante, etc.).
Si el procedimiento almacenado devuelve parámetros OUT, cada objeto CallableStatement debe registrarse antes ejecutándolo El tipo JDBC del parámetro OUT (esto es necesario porque algunos DBMS requieren tipos JDBC). El registro de un tipo JDBC se realiza mediante el método RegisterOutParameter. Después de ejecutar la declaración, el método getXXX de CallableStatement recuperará el valor del parámetro.
El método getXXX correcto es el tipo Java correspondiente al tipo JDBC registrado para cada parámetro. En otras palabras, RegisterOutParameter utiliza un tipo JDBC (por lo que coincide con el tipo JDBC devuelto por la base de datos) y getXXX lo convierte a un tipo Java.
Por ejemplo, el siguiente código primero registra el parámetro OUT, ejecuta el procedimiento almacenado llamado por cstmt y luego recupera el valor devuelto en el parámetro OUT. El método getByte toma un byte de Java del primer parámetro OUT y getBigDecimal toma un objeto BigDecimal (tres dígitos después del punto decimal) del segundo parámetro OUT:
sentencia invocable cs TMT = con prepare call(. " { llamar a obtener datos de prueba(?, ?)}");
cstmt.registerOutParameter(1, Java. SQL. tipos. tinyint);
cstmt.registerOutParameter(2, java .sql.Types.DECIMAL, 3);
cs TMT .ejecutar consulta();
byte x = cstmt . Java . math . bigdecimal n = cstmt . getbigdecimal(2, 3);
A diferencia de ResultSet, CallableStatement no proporciona un mecanismo especial para recuperar valores OUT grandes de forma incremental.
3.Parámetros INOUT
Además del método RegisterOutParameter, los parámetros que admiten tanto entrada como salida (parámetros INOUT) también deben llamar al método setXXX apropiado (heredado de PreparedStatement). El método setXXX establece el valor del parámetro como parámetro de entrada, mientras que el método RegisterOutParameter registra su tipo JDBC como parámetro de salida. El método setXXX proporciona un valor Java. El controlador primero convierte este valor en un valor JDBC y luego lo envía a la base de datos. El tipo JDBC de este valor IN debe ser el mismo que el tipo proporcionado al método RegisterOutParameter. Luego, para recuperar el valor de salida, se debe utilizar el método getXXX correspondiente. Por ejemplo, un parámetro de tipo byte de Java debe utilizar el método setByte para asignar el valor de entrada. RegisterOutParameter debe proporcionarse con JDBC tipo TINYINT y getByte debe usarse para recuperar el valor de salida.
El siguiente ejemplo asume un procedimiento almacenado reviseTotal cuyo único parámetro es el parámetro INOUT. El método setByte establece este parámetro en 25, que el controlador envía a la base de datos como un tipo JDBC TINYINT. A continuación, RegisterOutParameter registra el parámetro como JDBC TINYINT. Después de ejecutar el procedimiento almacenado, se devolverá un nuevo valor JDBC TINYINT. El método getByte recupera este nuevo valor como un tipo de byte Java.
sentencia invocable cstmt = con . prepare call(" { call review total(?)}");
cstmt.setByte(1, 25);
cstmt .registeroutparameter(1, Java . SQL . tipos . tinyint);
cs TMT ejecutar actualización()
byte x = cstmt . /p>
4. Primero recupere los resultados, luego recupere los parámetros OUT.
Debido a ciertas limitaciones del DBMS, para lograr la máxima portabilidad, se recomienda recuperar primero los resultados generados al ejecutar el objeto CallableStatement y luego usar el método CallableStatement.getXXX para recuperar los parámetros. Si el objeto CallableStatement devuelve varios objetos ResultSet (llamando al método de ejecución), se deben recuperar todos los resultados antes de recuperar los parámetros OUT. En este caso, para garantizar que se haya accedido a todos los resultados, se deben llamar a los métodos de declaración getResultSet, getUpdateCount y getMoreResults hasta que no haya más resultados.
Una vez recuperados todos los resultados, el valor del parámetro OUT se puede recuperar utilizando el método CallableStatement.getXXX.
5. Recuperar valores nulos como parámetros OUT.
El valor devuelto al parámetro OUT puede ser un valor nulo de JDBC. Cuando esto sucede, los valores nulos de JDBC se convierten para que el valor devuelto por el método getXXX sea NULL, 0 o falso, según el tipo de método getXXX. Para los objetos ResultSet, la única forma de saber si 0 o false se originó en JDBCNULL es detectar utilizando el método wasNull. Si el último valor leído por el método getXXX es JDBC NULL, el método devuelve verdadero; de lo contrario, devuelve falso.