SQLでウェブ・サービスを起動する
DB2 for iのアップデートでサポートが追加
ウェブ・サービスのおかげで開発者たちは他のアプリケーションの機能を、たとえそのアプリケーションがどの言語で、どこで開発されたものであったとしても、容易に統合、活用することができます。今まで以上に多くのプログラマーがSQLをプログラミング言語として使うようになり、SQLがウェブ・サービスの起動をサポートするのは当然の流れです。幸いなことにDB2 for i SQLインタフェースはこの機能をTR6 for IBM i 7.1で提供し始めました。
この新機能により、DB2 for iはHTTPメソッドを起動するユーザー定義関数を備え、それがウェブ・サービスへのアクセスの基本となるメカニズムとなっているのです。こうした新しい機能によりRESTfulおよびSOAPウェブ・サービスにアクセスが可能となりました。新しいDB2 for iの機能は以下のHTTPメソッドをサポートしています。
- GET
- PUT
- POST
- DELETE
- HEAD
SYSTOOLSスキーマ
図1のSQLスクリプトは実行中のユーザー定義のHTTP GET関数です。この簡単な例ではHTTPGETCLOB関数を使用して指定されたURLのHTMLのソースコードを取り出しています。SQL INSERT文は、HTTPGETCLOB関数が返したCLOB値をアーカイブするためにDB2テーブル内に格納します。
この関数の起動が、IBMが提供しているスキーマであるSYSTOOLSの条件を明示的に満たしていることにお気づきになったかもしれません。HTTP関数がこのスキーマにあるときは以下の2つの点について考慮しなければなりません。まず、SYSTOOLSスキーマはデフォルトのSQLパスの一部ではなく、条件を満たしていない関数呼び出しを解消するためにDB2が使用するためのものです。その結果、HTTP関数の起動をSYSTOOLSスキーマで明示的に条件を満足させるか(図1参照)、あるいはSET PATH文を実行してSYSTOOLSをSQLのパスに追加する必要があります。
次に考慮しなければならない点は、IBMがSYSTOOLSスキーマを使用して汎用のツールや例をIBM iデベロッパー・コミュニティーで共有しようとしているということです。こうしたSYSTOOLのツールや例はお客様が利用可能な状態になっていますが、公式にはIBM i OSの一部とはみなされていません。したがって、発見された欠陥に対する修正をIBMのサポートが提供するという保証はありません。さらに、DB2 for i SQL ReferenceのHTTP関数に関するドキュメントはありません。代わりにすべての参照情報は「Accessing Web Services Using IBM DB2 for i HTTP UDFs and UDTFs (IBM DB2 for i HTTPのUDFおよびUDTFを使用してウェブ・サービスにアクセスする)」という題名のホワイト・ペーパーで発行されています。IBM iを利用している開発部門の中にはHTTP関数を今までのままで使用することで満足される部門もあると思いますし、HTTP関数を利用してプロトタイプをすばやく組み立ててIBMが提供するソースコードを使用してより堅牢なソリューションを開発する部門もあるでしょう。上記のホワイト・ペーパーに詳細が記述されており、ソースコードも載っています。
ウェブ・サービスの起動
こうしたハイレベルの考慮点を横に置いておいて、ウェブ・サービスの起動の例を見て行きましょう。まず、IBM iシステム上に必要なコードを持ってくる必要があります。IBM i 7.1データベース・グループPTFレベル23を読み込み、Java 1.6以降のバージョン(5761-JV1オプション11、12、14または15)がインストールされていることを確認します。
次に、SQLで起動したいウェブ・サービスを識別し、その仕様を調べます。この例では米国海洋大気庁(NOAA: National Oceanic and Atmospheric Administration)が提供しているRESTウェブ・サービスを使用して国立測候所のディジタル気象予報データベースから気象予報データを取り出します。位置、時間範囲、気象予報データのタイプを入力値として与えると、ウェブ・サービスが要求された気象データをXML文字列で返してきます。
さてウェブ・サービスに与える入力パラメーターについて理解しましたので、新しいHTTP関数を使用してこのウェブ・サービスを起動するためにSQLを書く準備が整いました。図2に示すSQL VALUES文は、HTTPGETCLOB関数を使用してNOAAサービスのURLを1番目のパラメーター値として渡すことで気象予報データを要求しています。この関数の2番目のパラメーターはHTTPヘッダーを渡すためのものです。この例ではヘッダーは使用していませんので、空文字列値('')を渡しています。入力したURLはミネソタ州ロチェスター市(zipcodeList = 55901)の2013年8月15日(begin = and end = )の予想最高気温(maxt = maxt)を要求しています。URL値が文字列定数でなければならないという要件はありませんので、プログラムからはHTTPGETCLOB関数に動的に構築したURLを含んだホスト変数を渡すことができます。
NOAAのウェブ・サービスがリクエストを受け取ると、HTTP関数に対して気象データをXML形式で返します。VALUES文が図3に示すようにXML値をアプリケーションに対して返します。ロチェスター市の予想最高気温が<temperature>要素に入っているのがわかるはずです。
アプリケーションで必要なのが温度の値だけであれば、XMLドキュメント全体を処理して1つの値を取得することはしたくないでしょう。幸いなことに、DB2 for i 7.1で提供されている統合XMLサポートを使用するとXMLドキュメントから生のビジネス値を抽出することができます。温度値だけをアプリケーションに返す一つの方法はXMLTABLE関数を使用する方法です。この関数を使用すると、通常のSQL結果セットの一部としてXMLドキュメント内にデータをカプセル化した形で返すことができます。
図4のSELECT文はXMLTABLE関数をHTTPGETCLOB関数と組み合わせて使用して、図1に示す単純な結果を返しています。XMLTABLE関数の最初の引数には、SQL結果セット中の行として返してほしい値を含んだXML要素(/dwml/data/parameters/temperature)を識別する行の式を指定します。XMLPARSE関数は、HTTP関数が返したCLOB値をXMLTABLE関数が処理できるXMLデータ・タイプのインスタンスに変換します。
COLUMNS節はXMLTABLE関数が返す結果セットの列定義を指定します。この定義には列名、列のデータ・タイプ、列値にXMLドキュメント中のどんな値を提供するかを指定します。予想最高気温は値要素中に入っており、この要素は温度要素の子要素となっています。温度の単位は温度要素の@units属性によって提供されます。結果を図5に示します。
この例ではHTTPGETCLOB関数を使用していますが、HTTPGETBLOB関数を使用してXMLドキュメントCCSIDがXMLドキュメントのエンコード宣言と一致していることを確かめる方が一般的には良いでしょう。私はここではHTTPGETCLOB関数を使用してXMLドキュメントの文字列表現を返しています。この方が、ウェブ・サービスが返してきたデータを可視化しやすいからです。HTTPGETBLOB関数はXMLドキュメントをバイナリー形式で返します。
HTTP関数をより深く掘り下げる
ここで紹介した簡単なウェブ・サービスの例は、DB2 for iで利用可能なHTTP関数スィートを使って成し遂げることのできるほんの表面をなぞっただけです。「Accessing Web Services Using IBM DB2 for i HTTP UDFs and UDTFs (IBM DB2 for i HTTPのUDFおよびUDTFを使用してウェブ・サービスにアクセスする)」をお読みになってSQLをどのように使用してアプリケーションにウェブ・サービスを統合できるのかの詳細をご理解ください。