English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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-
Alcance | Descriçã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.
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.
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-
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.
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.
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".
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(?)};
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);