title: SQLJ
text: # SQLJ
  
  SQLJ è uno standard ISO (ISO/IEC 9075-10) per istruzioni SQL incorporate in programmi Java.
  
  Al contrario di JDBC, SQLJ non è un'API ma un'estensione del linguaggio. In tal modo i programmi SQLJ devono essere eseguiti da un preprocessore (lo SQLJ translator) prima di essere compilati.
  
  Alcuni vantaggi di SQLJ su JDBC:
  
  * I programmi SQLJ tendono ad essere più brevi di quelli JDBC.
  * La sintassi SQL può essere controllata in fase di compilazione.
  
  Alcuni svantaggi di SQLJ rispetto a JDBC:
  
  * SQLJ richiede un preprocesso.
  * Molte IDE non hanno un supporto specifico per SQLJ.
  * Non c'è supporto SQLJ in alcune piattaforme middleware, come Hibernate.
  
  ## Esempi
  
  I seguenti esempi mostrano i diversi usi della sintassi di SQLJ e JDBC.
  
  | JDBC | SQLJ |
  | - | - |
  | Query multi-riga ||
  | 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 }; while (true) { #sql { FETCH :iter INTO :lastname, :firstname, :salary }; if (iter.endFetch) break; // Print row... } iter.close; |
  | Query di una riga ||
  | PreparedStatement stmt = conn.prepareStatement( "SELECT MAX(SALARY), AVG(SALARY)" + " FROM DSN8710.EMP"); rs = statement.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 }; |
  | INSERT ||
  | 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) }; |
  