ストアード プロシージャーをプロンプトする
この記事では、ストアード プロシージャーに関して、見落とされがちな2つの点について述べようと思います。すなわち、ストアード プロシージャーやパラメーターをプロンプトする方法(「SQLスクリプトの実行」で)と、パラメーターを名前で渡す方法についてです。
歳のせいでしょうか、ストアード プロシージャーの名前やパラメーターに対する記憶力が、どうも、低下してきているような気がします。今のところは、使用するストアード プロシージャーが、どのライブラリー/スキーマにあるのか覚えているのであれば、よしとしましょう。
ちょうど良い例があります。先日のことです。2015年に記事に書いた、表でPIVOTを実行するストアード プロシージャーに関してメールを受け取りました。そのメールには、記事のタイトル(「SQLピボット・プロシージャー」)も、さらに重要なことに、そのストアード プロシージャーの名前も明示されていませんでした。もちろん、『IT Jungle』サイトの強力な検索機能を使用すれば、その記事を見つけることもできたでのしょうが、正直に言うと、自分が書いた記事を読むのはあまり好きではありません。そうしたところで、たまたま目の前に「SQLスクリプトの実行」の画面が開いていました。
そのプロシージャーがどのライブラリー(スキーマ)にあるのかについては覚えていたので、まずは、パスをそのスキーマに設定しました。次いで、「CALL」と入力して、F4を押しました。以下のように、そのパスにあるすべてのプロシージャーのリストが表示されました。
DO_PIVOT(DO_PIVVOTではありません)が、探していたものだろうと思われたので、リストで選択してEnterを押しました。DO_PIVOTが、入力した「call」の後に適切に配置されます。
しかし、パラメーターやそれらの順序についてはあまり覚えていなかったため、プロシージャー名の後に開き括弧と閉じ括弧を入力し、括弧の間にカーソルを置いて、再度、F4を押しました。パラメーターのリストが適切に表示されました。リストの下方へカーソルを移動すると、それぞれのパラメーターの定義が表示されます。
すべてのパラメーターを選択するために、Shiftキーを押したまま、リストの最初と最後のパラメーターをクリックして、Enterを押します。
残念なことに、すべてのパラメーターが1つの行に配置されてしまったため、パラメーターが1行に1つずつ配置されるよう整理します。次いで、それぞれのパラメーターに値を割り当て、ステートメントを実行しました。
ここからは、2つ目のテーマに移ります。ストアード プロシージャーを呼び出すときに、パラメーターを定位置形式で定義するか、名前で定義するかを選ぶことができます。このプロシージャーは、以下のように、定位置形式のパラメーターを使用して呼び出すこともできました。
call DO_PIVOT('SQLSTAND',
'SALES',
'SALES_PERSON',
'SALES',
DEFAULT,
'REGION');
しかし、パラメーターに名前を付けることの利点の1つは(見るからに読みやすいことは別として)、パラメーターの位置順序を気にしなくて済むことです(名前がパラメーターを定義します)。この呼び出しは、以下のように、気軽に書くこともできます。
call DO_PIVOT(GROUP_COLUMN => 'REGION',
AGG_FUNCTION => DEFAULT,
VALUE_COLUMN => 'SALES',
PIVOT_COLUMN => 'SALES_PERSON',
FOR_TABLE => 'SALES',
FOR_SCHEMA => 'SQLSTAND');
また、以下のように、定位置形式パラメーターと名前付きパラメーターを併用することもできますが、一度、名前付きパラメーターを使用したら、それ以降はすべて名前付きパラメーターを使用する必要があります。
call DO_PIVOT('SQLSTAND',
'SALES',
PIVOT_COLUMN => 'SALES_PERSON',
VALUE_COLUMN => 'SALES',
AGG_FUNCTION => DEFAULT,
GROUP_COLUMN => 'REGION');
なお、数あるIBM i サービスおよびDb2 for iサービスのいくつかを使用する場面を考えると、パラメーターをプロンプトする機能はかけがえのない機能だと痛感させられると思います。
高齢に向かってよろめきながらも、私が生産的でいられるようにしてくれる機能を開発してくれたロチェスターのACSチームには、心の底から感謝しています。