The procedure is the first call to the data base after opening the connection, so there is no transaction open/pending from outside this procedure. Within the procedure itself however I need to query the catalog to see if a role is already set and only if this is not the case set the role as needed/ determined by a second select. So the set role is not and can not be the first SQL statement within the procedure. Attached is the java code of the procedure. I am receiving the error when using IJ to connect via a first 'connect jdbc:derby:....' statement, followed by a 'Call rte."SP_setRole"();' statement.
Thanks for your help public static void SP_setRole() throws SQLException { Connection conn = DriverManager.getConnection("jdbc:default:connection"); boolean lRoleNeedsToBeSet = false; String vcRole = ""; Statement stmt = conn.createStatement(); // every user can read this system table which always holds only one row String cSQL = "SELECT CURRENT_ROLE FROM sysibm.sysdummy1"; ResultSet rs = stmt.executeQuery(cSQL); while (rs.next()) { vcRole = rs.getString(1); // result will be NULL if no role is set if (rs.wasNull()) { lRoleNeedsToBeSet = true; // DB-Admin procedures will ensure each data base user will only // be granted ONE role, i.e. the most priviledged role in the hierarchie // hierrachie of roles defined for the app, directly to his login cSQL = "SELECT roleid FROM sys.sysroles WHERE grantee = current_user"; ResultSet rs1 = stmt.executeQuery(cSQL); while (rs1.next()) { vcRole = rs1.getString(1); break; // to be on the safe side, although rs1 should always //hold only one row } rs1.close(); } break; // again, just to be on the safe side } rs.close(); // if no role is set, then set role to the role assigned to the user by the // application owner/dbo; (else role already set will remain unchanged) if (lRoleNeedsToBeSet) { cSQL = "SET ROLE " + vcRole; stmt.executeUpdate(cSQL); } stmt.close(); return; }