2011-12-20 15 views
0

私はDebian GNU/Linux上でIBM DB2 9.7.2を使用しています。条件付きDROP INDEXが必要な場合にのみ必要です。サポートされていないので、私はインデックス名としてIN idx_name VARCHAR(128)を受け入れる手順を書いた。このプロシージャーで、その名前の索引がSYSCAT.INDEXESに存在するかどうかをチェックし、そうであれば実行します。条件付きDROP INDEX in db2

DROP INDEX idx_name;

しかし、明らかにDROP INDEXは文字列を受け入れません。

は、代わりに私がSYSPROC.SYSTS_DROPを()を使用してみましたが、それは私にエラーを与えた:エラーは、テキスト検索管理プロシージャーまたはコマンド 中に発生した

SQL20427N。エラーメッセージは "CIE00340実行可能プログラム " cieadmsv "を開始できません。" SQLSTATE = 38H14

私はおそらくそのインデックスをドロップ行うための手順を変更し、エラーがないように、例外をキャッチすることが存在しない場合、私はまだ知りませんでした:どのように私はDROPインデックスを作ることができます変数を受け入れますか?

答えて

2

DROP INDEXは、ほとんどのSQLと同様に、識別子のパラメータを受け入れません(SELECTステートメントではこれを行うことはできません)。私はこれが、オプティマイザがステートメントの検証/準備を行おうとしていることを期待しています。結局のところ、カラムの内容はにしか指定できません。

  1. 使用動的SQL文を作成しPREPAREおよびEXECUTEする:

    2つのオプションがあります。ストアドプロシージャ内でこれを実行できるはずです。しかし、私はこれを慎重に扱うことがあります。不正な人物が証拠資料を削除する可能性があるためです(手順の設定に応じて)。

  2. エラーを無視してください。具体的には、SQLCODE -204を無視します(これは、iSeries DB2コードです)。では、存在しない場合はどうしますか?とにかくそれを削除しようとしていました...他のエラーはまだ報告されている/対処されるべきです。
+0

ご返信ありがとうございます。 SYSCAT.INDEXESと 'IDX_NAME'(一重引用符)を使用して索引が存在するかどうか、そしてIDX_NAME(引用符なし)を使用して索引をドロップするかどうかを最初に確認するだけで、手動で索引付けすることになりました。私はあなたのオプションを検討するかもしれません。手続きは一度だけ実行されるので(アップグレードスクリプトで作成、実行、削除)、私はあなたのオプション1に簡単に行くことができます。 – dimir