JDBC - Procedimento Armazenado
Aprendemos como usar Stored Proceduresem JDBC enquanto discute o capítulo JDBC - Instruções . Este capítulo é semelhante àquela seção, mas forneceria informações adicionais sobre a sintaxe de escape JDBC SQL.
Assim como um objeto Connection cria os objetos Statement e PreparedStatement, ele também cria o objeto CallableStatement, que seria usado para executar uma chamada para um procedimento armazenado do banco de dados.
Criação do objeto CallableStatement
Suponha que você precise executar o seguinte procedimento armazenado 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;
END;
NOTE: O procedimento armazenado acima foi escrito para Oracle, mas estamos trabalhando com banco de dados MySQL, portanto, vamos escrever o mesmo procedimento armazenado para MySQL da seguinte forma para criá-lo no banco de dados 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 ;
Existem três tipos de parâmetros: IN, OUT e INOUT. O objeto PreparedStatement usa apenas o parâmetro IN. O objeto CallableStatement pode usar todos os três.
Aqui estão as definições de cada -
Parâmetro | Descrição |
---|---|
DENTRO | Um parâmetro cujo valor é desconhecido quando a instrução SQL é criada. Você associa valores a parâmetros IN com os métodos setXXX (). |
FORA | Um parâmetro cujo valor é fornecido pela instrução SQL que ele retorna. Você recupera valores dos parâmetros OUT com os métodos getXXX (). |
INOUT | Um parâmetro que fornece valores de entrada e saída. Você vincula variáveis com os métodos setXXX () e recupera valores com os métodos getXXX (). |
O seguinte snippet de código mostra como empregar o Connection.prepareCall() método para instanciar um CallableStatement objeto baseado no procedimento armazenado anterior -
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
A variável String SQL representa o procedimento armazenado, com espaços reservados para parâmetros.
Usar objetos CallableStatement é muito parecido com usar objetos PreparedStatement. Você deve vincular valores a todos os parâmetros antes de executar a instrução ou receberá uma SQLException.
Se você tiver parâmetros IN, apenas siga as mesmas regras e técnicas que se aplicam a um objeto PreparedStatement; use o método setXXX () que corresponde ao tipo de dados Java que você está associando.
Ao usar os parâmetros OUT e INOUT, você deve empregar um método CallableStatement adicional, registerOutParameter (). O método registerOutParameter () vincula o tipo de dados JDBC ao tipo de dados que o procedimento armazenado deve retornar.
Depois de chamar seu procedimento armazenado, você recupera o valor do parâmetro OUT com o método getXXX () apropriado. Este método converte o valor recuperado do tipo SQL em um tipo de dados Java.
Fechando objeto CallableStatement
Assim como você fecha outro objeto Statement, pelo mesmo motivo você também deve fechar o objeto CallableStatement.
Uma chamada simples para o método close () fará o trabalho. Se você fechar o objeto Connection primeiro, ele também fechará o objeto CallableStatement. No entanto, você deve sempre fechar explicitamente o objeto CallableStatement para garantir a limpeza adequada.
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
cstmt.close();
}
estudoEstudamos mais detalhes em Chamável - Código de exemplo .
Sintaxe de escape JDBC SQL
A sintaxe de escape oferece a flexibilidade de usar recursos específicos do banco de dados indisponíveis para você usando métodos e propriedades JDBC padrão.
O formato geral da sintaxe de escape SQL é o seguinte -
{keyword 'parameters'}
Aqui estão as seguintes sequências de escape, que você consideraria muito úteis ao executar a programação JDBC -
d, t, ts Palavras-chave
Eles ajudam a identificar literais de data, hora e carimbo de data / hora. Como você sabe, dois SGBDs não representam a hora e a data da mesma maneira. Esta sintaxe de escape diz ao driver para renderizar a data ou hora no formato do banco de dados de destino. Por exemplo -
{d 'yyyy-mm-dd'}
Onde aaaa = ano, mm = mês; dd = data. Usando esta sintaxe {d '2009-09-03'} é 9 de março de 2009.
Aqui está um exemplo simples mostrando como INSERIR data em uma tabela -
//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);
Da mesma forma, você pode usar uma das duas sintaxes a seguir, t ou ts -
{t 'hh:mm:ss'}
Onde hh = hora; mm = minuto; ss = segundo. Usando esta sintaxe {t '13: 30: 29 '} é 1:30:29 PM.
{ts 'yyyy-mm-dd hh:mm:ss'}
Esta é a sintaxe combinada das duas sintaxes acima para 'd' e 't' para representar o carimbo de data / hora.
escapar palavra-chave
Esta palavra-chave identifica o caractere de escape usado nas cláusulas LIKE. Útil ao usar o curinga SQL%, que corresponde a zero ou mais caracteres. Por exemplo -
String sql = "SELECT symbol FROM MathSymbols
WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);
Se você usar o caractere de barra invertida (\) como o caractere de escape, você também terá que usar dois caracteres de barra invertida em seu literal de String Java, porque a barra invertida também é um caractere de escape Java.
palavra-chave fn
Esta palavra-chave representa funções escalares usadas em um DBMS. Por exemplo, você pode usar o comprimento da função SQL para obter o comprimento de uma string -
{fn length('Hello World')}
Isso retorna 11, o comprimento da cadeia de caracteres 'Hello World'.
chamar palavra-chave
Esta palavra-chave é usada para chamar os procedimentos armazenados. Por exemplo, para um procedimento armazenado que requer um parâmetro IN, use a seguinte sintaxe -
{call my_procedure(?)};
Para um procedimento armazenado que exija um parâmetro IN e retorne um parâmetro OUT, use a seguinte sintaxe -
{? = call my_procedure(?)};
oj palavra-chave
Esta palavra-chave é usada para significar junções externas. A sintaxe é a seguinte -
{oj outer-join}
Onde outer-join = tabela {LEFT | RIGHT | FULL} OUTERJOIN {tabela | outer-join} na condição de pesquisa. Por exemplo -
String sql = "SELECT Employees
FROM {oj ThisTable RIGHT
OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);