CREATE TABLE products (ID int primary key, name varchar, type varchar) CREATE TABLE contracts (ID int primary key, product int, revenue decimal, dateSigned date) CREATE TABLE revenueRecognitions (contract int, amount decimal, recognizedOn date, PRIMARY KEY(contract, recognizedOn)) CREATE PROCEDURE INSERT_RECOGNITION (IN contractID int, IN amount decimal, IN recognizedOn date, OUT result int) LANGUAGE SQL BEGIN INSERT INTO revenueRecognitions VALUES( contractID, amount, recognizedOn); SET result = 1; END final String findContractStatement= "SELECT * FROM contracts c, products p" + "WHERE ID = ? AND c.product = p.ID "; final String insertCallStatement ="{call INSERT_RECOGNITIONS(?,?,?)}"; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SqlException; import java.sql.Statement; public void calculateRecognitions( long contractID ) { Connection db=DriverManager.getConnection("jdbc:odbc:foobar","sunny",""); PreparedStatement stmt=db.prepareStatement(findContractStatement); stmt.setLong(1,contractID); ResultSet contracts=stmt.executeQuery(); contracts.next(); Money totalRevenue=Money.dollars(contracts.getBigDecimal("revenue")); MfDate recognitionDate=new MfDate(contracts.getDate("dateSigned")); /* Money[] allocation = totalRevenue.allocate(2); CallableStatement cstmt=db.prepareCall(insertCallStatement); cstmt.setLong(1,contractID); cstmt.setBigDecimal(2,allocation[0]); cstmt.setDate(3,recognitionDate.addDate(30)); cstmt.registerOutParameter(4,java.sql.Types.TINYINT); cstmt.executeUpdate(); byte x = cstmt.getByte(4); */ }