@@ -141,16 +141,19 @@ protected void doClean() throws SQLException {
141
141
jdbcTemplate .execute (dropStatement );
142
142
}
143
143
144
- // procedures
145
- for (String dropStatement : generateDropStatementsForProcedures ()) {
146
- jdbcTemplate .execute (dropStatement );
147
- }
148
-
149
144
// triggers
150
145
for (String dropStatement : generateDropStatementsForTriggers ()) {
151
146
jdbcTemplate .execute (dropStatement );
152
147
}
153
148
149
+ // drop procedures by iteratively dropping procedues without dependents (until no procedures are remaining)
150
+ do {
151
+ dropStatements = generateDropStatementsForProceduresWithoutDependents ();
152
+ for (String dropStatement : dropStatements ) {
153
+ jdbcTemplate .execute (dropStatement );
154
+ }
155
+ } while (dropStatements .size () > 0 );
156
+
154
157
for (Function function : allFunctions ()) {
155
158
function .drop ();
156
159
}
@@ -176,14 +179,16 @@ private String getSqlId() {
176
179
}
177
180
178
181
/**
179
- * Generates DROP statements for the procedures in this schema.
182
+ * Generates DROP statements for the procedures in this schema that do not have dependent procedures .
180
183
*
181
184
* @return The drop statements.
182
185
* @throws SQLException when the statements could not be generated.
183
186
*/
184
- private List <String > generateDropStatementsForProcedures () throws SQLException {
185
- String dropProcGenQuery = "select rtrim(NAME) from SYSIBM.SYSROUTINES where CAST_FUNCTION = 'N' " +
186
- " and ROUTINETYPE = 'P' and SCHEMA = '" + name + "' and OWNER = '" + this .getSqlId () + "'" ;
187
+ private List <String > generateDropStatementsForProceduresWithoutDependents () throws SQLException {
188
+ String dropProcGenQuery = "select rtrim(sr.NAME) from SYSIBM.SYSROUTINES sr where sr.CAST_FUNCTION = 'N'" +
189
+ " and sr.ROUTINETYPE = 'P' and sr.SCHEMA = '" + name + "' and sr.OWNER = '" + this .getSqlId () + "'" +
190
+ " and not exists ( select * from SYSIBM.SYSDEPENDENCIES sd where sd.BNAME=sr.NAME" +
191
+ " and sd.BSCHEMA=sr.SCHEMA and sd.DTYPE='O' )" ;
187
192
return buildDropStatements ("DROP PROCEDURE" , dropProcGenQuery );
188
193
}
189
194
0 commit comments