import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Connection; import java.util.ArrayList; import java.util.Scanner; public class Primer { static { try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { ArrayList obradjeni = new ArrayList(); // Parser standardnog ulaza Scanner skener = new Scanner(System.in); // Odgovor korisnika char c; try { Connection con = null; String url = "jdbc:db2://localhost:50001/VSTUD"; con = DriverManager.getConnection(url, "student", "abcdef"); ResultSet rs = null; PreparedStatement s = con.prepareStatement("select id_predmeta, naziv " + "from predmet " + "where id_predmeta in (select id_predmeta " + "from obavezan_predmet " + "where id_smera=201)", rs.HOLD_CURSORS_OVER_COMMIT); rs = otvoriKursor(s); String update = "update predmet " + "set bodovi = bodovi + 1 " + "where current of "; String cursorName = rs.getCursorName(); Statement updateStatement = con.createStatement(); while(rs.next()){ int id_predmeta = 0; String naziv = ""; try { id_predmeta = rs.getInt(1); naziv = rs.getString(2); if(!obradjeni.contains(id_predmeta)) { // Ispisuju se procitane vrednosti za predmet System.out.printf("%5d %20s\n", id_predmeta, naziv); System.out.println("Da li korisnik zeli da promeni broj bodova za dati predmet? (d ili n)"); c = skener.next().charAt(0); if(c == 'd' || c == 'D') { // Azuriranje /* Proverava se da li trazeni X katanac ne dovodi do nekog * od problema konkurentog izvrsavanja */ try { updateStatement.executeUpdate(update + cursorName); }catch(SQLException e){ if(e.getErrorCode() == -911 || e.getErrorCode() == -913) { System.out.println("Objekat je zakljucan od strane druge transakcije\n. Sacekati neko vreme."); rs.close(); con.rollback(); System.out.println("---Rollback---"); rs = otvoriKursor(s); } } // Potvrda obrade. Iterator se ne zatvara, vec se pozicionira ispred narednog // reda rezultujuce tabele, jer je definisan sa opcijom holdability=true System.out.println("---Commit---"); con.commit(); // Evidentiranje obrade obradjeni.add(id_predmeta); } } }catch (SQLException e) { if(e.getErrorCode() == -911 || e.getErrorCode() == -913) { System.out.println("Objekat je zakljucan od strane druge transakcije\n. Sacekati neko vreme."); rs.close(); con.rollback(); System.out.println("---Rollback---"); rs = otvoriKursor(s); } } } rs.close(); s.close(); con.close(); } catch (SQLException e) { System.err.println("SQL error " + e.getErrorCode()); } catch (Exception e) { e.printStackTrace(); } } private static ResultSet otvoriKursor(PreparedStatement s) throws SQLException { ResultSet rs = s.executeQuery(); return rs; } }