SQLJ - SQLJ

SQLJ é um título de trabalho preterido por esforços para combinar Java e SQL . Foi um esforço comum começou por volta de 1997 por engenheiros da IBM , a Oracle , Compaq , Informix , Sybase , Cloudscape e Sun Microsystems .

É composto de três partes: 0, 1 e 2. Parte 0 descreve a incorporação de instruções SQL em programas Java. SQLJ parte 0 é a base para a parte 10 do SQL: 1999 standard, aka SQL linguagem Object Bindings (SQL / OLB). Partes SQLJ 1 e 2 descreve a possibilidade converse usar classes Java (rotinas e tipos) a partir de instruções SQL. Partes 1 e 2 são a base para a parte 13 do padrão SQL, SQL rotinas e tipos usando a linguagem de programação Java (SQL / JRT).

"SQLJ" é comumente usado para se referir a apenas SQLJ parte 0, geralmente quando é contrastada com outros meios de incorporar SQL em Java, como JDBC .

normas ANSI e ISO

  • SQLJ parte 0: ANSI X3.135.10-1998, "Banco de Dados Linguagem SQL-Parte 10: Object Bindings Language (SQL / OLB)"
  • SQLJ parte 1: ANSI NTIC 331,1-1.999, "SQLJ-Parte 1: Rotinas SQL Usando a Linguagem de Programação Java"
  • SQLJ parte 2: ANSI NTIC 331,2-2.000, "SQLJ-Parte 2: Tipos SQL usando a Linguagem de Programação Java"

Parte 0 foi actualizada para compatibilidade JDBC 2.0 e ratificado por ISO em 2000. As últimas duas partes foram combinadas, quando submetido a ISO. Parte 2 foi substancialmente reescrito para a apresentação ISO porque a versão ANSI não era formal suficiente para uma especificação, sendo mais perto do estilo de um manual do usuário . A versão combinada foi ratificado em 2002.

  • ISO / IEC 9075-10: 2000, Tecnologia da Informação-Banco de Dados linguagens de-SQL Parte 10: Object Bindings Language (SQL / OLB)
  • ISO / IEC 9075-13: 2002, Tecnologia da Informação-Banco de Dados línguas-SQL-Parte 13: Rotinas SQL e tipos usando a linguagem de programação Java (SQL / JRT) .

SQLJ parte 0

A parte 0 especificação SQLJ largamente originado a partir do Oracle, que também forneceram a primeira implementação de referência.

No seguinte SQLJ é um sinônimo para SQLJ parte 0.

Considerando JDBC fornece uma API , SQLJ consiste em uma linguagem de extensão. Assim, os programas que contenham SQLJ deve ser executado através de um pré-processador (o tradutor SQLJ) antes de poderem ser compilado.

vantagens

Algumas vantagens de SQLJ sobre JDBC incluem:

  • comandos SQLJ tendem a ser mais curtos do que os programas JDBC equivalentes.
  • sintaxe SQL pode ser verificado em tempo de compilação. Os resultados da consulta retornados também pode ser verificado estritamente.
  • Pré-processador pode gerar SQL estática que funciona melhor do que SQL dinâmica, porque plano de consulta é criado no tempo do programa de compilação, armazenados em banco de dados e reutilizado em tempo de execução. Estática SQL pode garantir a estabilidade do plano de acesso. IBM DB2 suporta o uso de SQL estática em programas SQLJ.

desvantagens

  • SQLJ requer um passo de pré-processamento.
  • Muitos IDEs não tem suporte SQLJ.
  • SQLJ não tem suporte para a maioria dos frameworks de persistência comuns, como Hibernate .
  • A Oracle 18c (12.2) tem desupported SQLJ no banco de dados.

Exemplos

Os exemplos que se seguem comparam a sintaxe SQLJ com uso JDBC.

consulta multi-row
JDBC SQLJ
PreparedStatement stmt = conn.prepareStatement(
   "SELECT LASTNAME"
 + " , FIRSTNME"
 + " , SALARY"
 + " FROM DSN8710.EMP"
 + " WHERE SALARY BETWEEN ? AND ?");
stmt.setBigDecimal(1, min);
stmt.setBigDecimal(2, max);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
  lastname = rs.getString(1);
  firstname = rs.getString(2);
  salary = rs.getBigDecimal(3);
  // Print row...
}
rs.close();
stmt.close();
#sql private static iterator EmployeeIterator(String, String, BigDecimal);
...
EmployeeIterator iter;
#sql [ctx] iter = {
  SELECT LASTNAME
       , FIRSTNME
       , SALARY
    FROM DSN8710.EMP
   WHERE SALARY BETWEEN :min AND :max
};
do {
  #sql {
    FETCH :iter
     INTO :lastname, :firstname, :salary
  };
  // Print row...
} while (!iter.endFetch());
iter.close();
consulta de linha única
JDBC SQLJ
PreparedStatement stmt = conn.prepareStatement(
    "SELECT MAX(SALARY), AVG(SALARY)"
  + " FROM DSN8710.EMP");
rs = stmt.executeQuery();
if (!rs.next()) {
  // Error—no rows found
}
maxSalary = rs.getBigDecimal(1);
avgSalary = rs.getBigDecimal(2);
if (rs.next()) {
  // Error—more than one row found
}
rs.close();
stmt.close();
#sql [ctx] {
  SELECT MAX(SALARY), AVG(SALARY)
    INTO :maxSalary, :avgSalary
    FROM DSN8710.EMP
};
INSERIR
JDBC SQLJ
stmt = conn.prepareStatement(
   "INSERT INTO DSN8710.EMP " +
   "(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "
 + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)");
stmt.setString(1, empno);
stmt.setString(2, firstname);
stmt.setString(3, midinit);
stmt.setString(4, lastname);
stmt.setBigDecimal(5, salary);
stmt.executeUpdate();
stmt.close();
#sql [ctx] {
  INSERT INTO DSN8710.EMP
    (EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)
  VALUES
    (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)
};

Veja também

Referências

Outras leituras

links externos