2011-12-20 152 views
0

我在Debian GNU/Linux上使用IBM DB2 9.7.2。我需要一個條件DROP INDEX,只要它存在。由於它不受支持,我寫了一個過程,接受IN idx_name VARCHAR(128)作爲索引名稱。在該過程中,我檢查SYSCAT.INDEXES中是否存在具有該名稱的索引,如果是,則執行db2中的條件DROP INDEX

DROP INDEX idx_name;

但顯然DROP INDEX不接受字符串。

或者我嘗試使用SYSPROC.SYSTS_DROP(),但它給了我一個錯誤:

SQL20427N文本搜索管理過程或 命令時出錯。錯誤消息是「CIE00340無法啓動可執行程序 」cieadmsv「。」。 SQLSTATE = 38H14

我大概可以修改程序,做丟棄指數和捕捉異常,所以沒有錯誤,如果不存在,但我仍然不知道:我怎樣才能使DROP INDEX到接受變量

回答

2

DROP INDEX與大多數SQL一樣,不接受標識符的參數(您也不能使用SELECT語句執行此操作)。我希望這與優化程序嘗試驗證/準備語句有關 - 畢竟,您只能在列內容中指定它們。

你有兩個選擇:

  1. 使用動態SQL創建語句,編制和執行。你應該可以在你的存儲過程中做到這一點。不過,我會小心這一點,因爲它可能會使未經授權的人刪除標記(取決於如何設置程序)。
  2. 忽略錯誤。特別是,忽略SQLCODE -204(嗯,這是iSeries DB2代碼)。那麼如果它不存在呢?無論如何,我們試圖將其刪除......其他錯誤仍應報告/處理。
+0

感謝您的回覆。由於我只需要以這種方式刪除某些索引,因此我最終只是手動執行該操作,首先使用SYSCAT.INDEXES和「IDX_NAME」(單引號)檢查索引是否存在,以及是否使用IDX_NAME(未加引號)刪除索引。不過我可能會考慮你的選擇。由於這個過程只需要運行一次(它的創建,運行,放入升級腳本),我可以輕鬆地使用您的選項1。 – dimir 2011-12-21 08:52:33