2011-12-20 153 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