2017-03-22 55 views
0

我想通過java刪除我的數據庫中的所有函數和過程。 我當前的代碼是像這樣:getProcedures和getFunctions返回相同的ResultSet

 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實際上是一個存儲過程。

回答

0

儘管您沒有明確地這樣說,但看起來您可能正在使用適用於Java的MS SQL Server驅動程序。

從文檔看來,getFunctionsgetProcedures方法都返回函數和過程的列表。您需要評估FUNCTION_TYPE列以確定哪個是哪個。

函數的類型。它可以是以下值之一:

SQL_PT_UNKNOWN(0)

SQL_PT_PROCEDURE(1)

SQL_PT_FUNCTION(2)