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

Procedimentos Armazenados JDBC

ao aprenderJDBC-instruçãoEnquanto aprendíamos sobre procedimentos armazenados no JDBC em um capítulo, neste capítulo, que é semelhante a esse, você receberá mais informações sobre a sintaxe de escape SQL do JDBC.

Assim como o objeto Connection cria objetos Statement e PreparedStatement, ele também cria objetos CallableStatement, que serão usados para executar chamadas de procedimentos armazenados no banco de dados.

Criar objeto CallableStatement

Supondo que você precise executar a seguinte procedura armazenada do 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;
FIM;

NOTA: A procedura armazenada acima foi escrita para Oracle, mas estamos usando o banco de dados MySQL, portanto, vamos escrever a mesma procedura armazenada para MySQL, conforme mostrado abaixo, para criar 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 parâmetros IN. O objeto CallableStatement pode usar todos os três.

Esta é a definição de cada um-

AlcanceDescrição
IN

Parâmetros cujos valores não são conhecidos ao criar a sentença SQL. Vincule valores aos parâmetros IN usando o método setXXX().

OUT

Seu valor é fornecido pelo parâmetro do comando SQL retornado. Recupere valores do parâmetro OUT usando o método getXXX().

INOUT

Fornece parâmetros com valores de entrada e saída. Você pode vincular variáveis usando o método setXXX() e recuperar valores usando o método getXXX().

O seguinte fragmento de código mostra como instanciar o objeto usando este método com base no procedimento armazenado anterior.-Connection.prepareCall()CallableStatement

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

A variável de string SQL representa o procedimento armazenado com marcadores de posição de parâmetros.

O uso do objeto CallableStatement é muito semelhante ao uso do objeto PreparedStatement. Você deve vincular os valores a todos os parâmetros antes de executar a sentença, ou receberá uma SQLException.

Se houver parâmetros IN, siga as mesmas regras e técnicas aplicáveis ao objeto PreparedStatement; use o método setXXX() correspondente ao tipo de dados Java vinculado.

Quando usar parâmetros OUT e INOUT, é necessário usar o método adicional CallableStatement registerOutParameter(). O método registerOutParameter() liga o tipo de dados JDBC ao tipo de dados esperado do procedimento armazenado retornado.

Após chamar o procedimento armazenado, você pode usar o método getXXX() apropriado para recuperar valores do parâmetro OUT. Este método converte o valor do tipo SQL retornado para o tipo de dados Java.

Fechar o objeto CallableStatement

Assim como ao fechar outros objetos Statement, pelos mesmos motivos, você também deve fechar o objeto CallableStatement.

Basta chamar o método close(). Se fechar primeiro o objeto Connection, ele também fechará o objeto CallableStatement. No entanto, você deve sempre fechar explicitamente o objeto CallableStatement para garantir que a limpeza seja feita corretamente.

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

estudamos emNos exemplos de código chamáveisestudou mais detalhes.

Sintaxe de escape JDBC SQL

A sintaxe de escape permite que você use características específicas do banco de dados que não podem ser usadas pelos métodos e atributos padrão do JDBC.
O formato da sintaxe de escape SQL genérica é o seguinte-

{keyword 'parâmetros'}

A seguir estão as sequências de escape, que você encontrará muito úteis ao executar programação JDBC-

palavras-chave d, t, ts

Eles podem ajudar a identificar textos de data, hora e timestamp. Como você sabe, diferentes dbms representam datas e horários de maneiras diferentes. Esta sintaxe de escape informa ao driver a apresentação da data ou hora no formato do banco de dados alvo. Por exemplo:

{d 'yyyy-mm-dd'}

onde yyyy = ano, mm = mês; dd = dia. Use esta sintaxe {d'2009-09-03'} é2009ano3mês9dia.

Este é um exemplo simples que mostra como inserir uma data na tabela-

//Criar um objeto Statement
stmt = conn.createStatement();
//Inserir dados ==> ID, Nome, Sobrenome, Data de Nascimento
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:touts

{t 'hh:mm:ss'}

onde hh = hora; mm = minuto; ss = segundo. Use esta sintaxe {t '13:30:29'} é1:30:29 PM.

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

Esta é a combinação de sintaxe das duas sintaxes acima, onde 'd' e 't' representam o timestamp.

palavra-chave escape

Este caractere de escape identifica o caractere de escape usado na cláusula LIKE. Muito útil ao usar o caractere de coringa % do SQL, que coincide com zero ou mais caracteres. Por exemplo:

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

Se o caractere de escape (\) for usado como caractere de escape, também devem ser usados dois caracteres de escape na string literal Java, pois o caractere de escape também é caractere de escape no Java.

palavra-chave fn

Esta palavra-chave representa a função escalar usada no DBMS. Por exemplo, você pode usar a função SQLlengthpara obter o comprimento da string-

{fn length('Hello World')}

Isso retornará11ou seja, o comprimento da string "Hello World".

palavra-chave call

Esta palavra-chave é usada para chamar procedimentos armazenados. Por exemplo, para procedimentos armazenados que precisam de parâmetros IN, use a seguinte sintaxe-

{call my_procedure(?)};

Para procedimentos armazenados que precisam de parâmetros IN e retornam parâmetros OUT, use a seguinte sintaxe-

{? = call my_procedure(?)};

palavra-chave oj

Esta palavra-chave é usada para representar a junção externa. A sintaxe é a seguinte-

{oj outer-join}

Onde, a junção externa = tabela {LEFT | RIGHT | FULL} OUTERJOIN {tabela | condição de busca. Por exemplo-

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