我正在尝试通过java删除数据库中的所有函数和过程。我当前的代码是这样的:
Class.forName(driver);
Connection conn = getConnectionToDB();
String itemName;
ResultSet rs = getResultSetForItem(item);
String upperCaseItem = item.toUpperCase();
while (rs.next()) {
itemName = rs.getString(upperCaseItem + "_NAME");
// Procedure and function names come with a grouping ID, remove it
if (item.equals("procedure") || item.equals("function"))
itemName = itemName.substring(0, itemName.indexOf(";"));
stmt = conn.createStatement();
stmt.executeUpdate(query + " " + itemName);
}
其中项目曾经是"功能",曾经是"过程"。此外,查询变量被正确设置为与执行相关的"DROP FUNCTION"或"DROP PROCEDURE"。
getResuletSetForItem 的方法:
Class.forName(driver);
Connection conn = getConnectionToDB();
DatabaseMetaData md = conn.getMetaData();
switch (item.toLowerCase()){
case "function":
rs = md.getFunctions("LDMS", "dbo", "%");
break;
case "procedure":
rs = md.getProcedures("LDMS", "dbo", "%");
break;
}
return rs;
发生的情况是,我根据我的要求将结果集作为函数或过程。但它也返回另一种类型的记录(意思是,如果我要求函数的 ResultSet,我也会收到过程(。
这当然会导致异常,例如,当我尝试执行"DROP FUNCTION X",其中 X 实际上是一个存储过程。
虽然你没有明确这么说,但看起来你可能正在使用适用于Java的MS SQL Server驱动程序。
从文档中看,getFunctions
和 getProcedures
方法都返回函数和过程的列表。您需要评估FUNCTION_TYPE
列以确定哪个是哪个。
函数的类型。它可以是以下值之一:
SQL_PT_UNKNOWN (0(
SQL_PT_PROCEDURE (1(
SQL_PT_FUNCTION (2(