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