このセクションでは、SOAtest/Virtualize で DB ツールを設定して適用する方法について説明します。 DB ツールを使用すると、 SOAtest で SQL 文を検証するためにデータベースにクエリーを送信できます。このセクションの内容:
DB ツールとは
このツールは、ユーザーが指定したデータベースにクエリーを送信します。クエリーから結果を受け取ると、SOAtest/Virtualize は結果を XML 形式にします。出力先に XML ベースのツール (XML Data Bank、 XSLT ツールなど) を連結できます。
DB ツールは、「PL/SQL とストアド プロシージャのサポート」で説明するように、PL/SQL を使用するなどして、ストアド プロシージャを呼び出すために使用できます。
Traffic Viewer は自動的に DB ツールに連結されます。 そのため、パラメータライズ、変数などを考慮して、サーバーへ送信された問い合わせの最終結果を参照できます 。レスポンスでは、JDBC 関連のオブジェクトを確認できます。
DB ツールの構成
以下で詳しく説明するように、DB ツールで構成できるオプションがいくつかあります。
全般
データ ソース: 値を提供するために使用するデータ ソースを指定します。このオプションは、 テスト スイートにデータ ソースが追加されている場合だけ利用可能です。
[接続] タブ
DB ツールをデータベースに接続する方法はいくつかあります。デフォルトでは、ファイルを使用することで、またはデータベース ドライバー設定を指定することで、ローカル接続を構成できます。
[ファイル] オプションを有効化し、ファイル システムまたはワークスペースの接続構成ファイルを探します。
[ローカル] オプションを有効化し、使用するデータベースの [ドライバー]、[URL]、[ユーザー名]、および [パスワード] を指定します。 データベース接続構成の詳細については「データベース構成パラメーター (SOAtest) 」または「データベース構成パラメーター (Virtualize) 」を参照してください。データベースを 1 度しか使わず、他のコマンドを待機する必要がない場合、[接続を閉じる] オプションを有効化して接続を閉じることもできます。すべての DB ツールが 1 つの接続を共有できるよう、複数の DB ツールを同じ DB に接続することを考えている場合、このオプションを有効化しないでください。DB ツールごとに新しく接続を確立するたびにリソースを消費するのに対して、接続を共有することはリソース効率を改善します。
テスト スイートにデータベース アカウントの共有プロパティがある場合、[ローカル設定を使用]、[共有プロパティを使用]、[両方を使用] を使って接続できます。これらのオプションを使用すると、関連する DB ツール内の設定だけ、共有のグローバル データベース アカウントからの設定 (グローバル プロパティとしてテスト スイートに追加したグローバル データベースの設定) だけ、あるいはその両方を使用できます。 共有プロパティの定義方法とファイルへのエクスポート方法の詳細については、「グローバル設定の追加 (SOAtest)」 または「グローバル設定の追加 (Virtualize)」 を参照してください。
Traffic ツールのコネクション ID をチェックすること
Traffic ツールはコネクション ID を表示します。この ID をチェックすることで、DB ツールが同じ接続設定を使用していることを確認できます。
[SQL クエリー] タブ
- SQL Query: [固定] または [パラメータライズ] のいずれかから SQL 文を指定できます。
- [固定] を選択した場合、 テキスト ボックスに特別な文字列 ${column} を入力し、[データ ソース] メニューからデータ ソースを選択することで、粒度の細かいパラメータライズを行うことができます。実行時に、ツールは指定のデータ ソースの列をルックアップします。どんな文字列の値でもパラメータライズできます。
たとえば、CA、 NY、 WA の 3 行を含むデータ ソースが作成された場合、[固定] テキスト ボックスに以下を入力できます。SELECT *
FROM People
WHERE state = ’${States}’
実行するとき、 DB ツールは次のクエリーを作成します。
SELECT *
FROM People
WHERE state = "CA"
SELECT *
FROM People
WHERE state = "NY"
SELECT *
FROM People
WHERE state = "WA"
書き込み可能なデータ ソースの値に接続する場合は、次を使用します。
${<Data Source Name>: <Column Name>}
コロン (:) と <Column Name> の間にはスペースが必要です。
XML Data Bank の値に接続する場合は、次を使用します。
${<Data Source Column Name mapped to Selected Element>}
- [固定] を選択した場合、 テキスト ボックスに特別な文字列 ${column} を入力し、[データ ソース] メニューからデータ ソースを選択することで、粒度の細かいパラメータライズを行うことができます。実行時に、ツールは指定のデータ ソースの列をルックアップします。どんな文字列の値でもパラメータライズできます。
- セミコロン (;) でステートメントを分割: このオプションをオンにした場合、ツールは SQL クエリー エディターのコンテンツをセミコロンで分割します。詳細については「Statement Separation Behavior」を参照してください。
- マジック トークン (通常はストアド プロシージャで使用される) でステートメントを分割: このオプションをオンにした場合、ツールは SQL クエリー エディターのコンテンツを、指定のマジック トークン文字列で分割します。マジック トークンとは、行の先頭から始まり、マジック トークンだけからなる文字列です (トークンの後ろに任意の空白を挿入できます)。詳細については「Statement Separation Behavior」を参照してください。
- ストアド プロシージャの JDBC OUT パラメーター型: パラメーターを取得する、または値を返す、ストアド プロシージャや関数を呼び出すことができます。
- 通常の SQL クエリーや、OUT パラメーターを持たないストアド プロシージャを実行する場合は、このフィールドは空にします。詳細については、以下の「JDBC OUT Parameter Types for Stored Procedures」を参照してください。
- 注意: それぞれの DB ツールの各呼び出し可能な文に同じ JDBC OUT パラメーターが送信されます。異なる OUT パラメーターを使用するには、別の DB ツールを作成します。
ステートメント セパレーターの動作
[セミコロン (;) でステートメントを分割] オプションを使用すると、ツールはセミコロンで SQL クエリー エディターのコンテンツを分割します。[マジック トークン (通常、ストアド プロシージャで使用される) でステートメントを分割] オプションを使用すると、ツールは指定したマジック トークン文字列で SQL クエリー エディターのコンテンツを分割します。マジック トークンとは、行の先頭から始まり、マジック トークンだけからなる文字列です (トークンの後ろに任意の空白を挿入できます)。
選択したセパレーターは、セミコロンの場合もマジック トークンの場合も、サーバーには送信されません。DB ツールは、それぞれの分割された部分文字列を別々の JDBC コールとして、同じ接続を使用してサーバーへ送信します。つまり、 1 つの DB ツールで複数のクエリーを使用することが可能です。SQL サーバーの DJBC ドライバーによっては、同じ JDBC コールで複数のクエリーを送信することが可能です。
- SQL Server: 同じ JDBC コールで複数のステートメントを送信できます (任意で、セミコロンで分割できます)。
- MySQL: 同じ JDBC コール中に複数のクエリーを送信できるようにするために、JDBC URL に "allowMultiQueries=true" を追加する必要があります。クエリーはセミコロンで分割します。例:
jdbc:mysql://boa:3306/test?allowMultiQueries=true
この機能は MySQL ドライバー の バージョン 4.0 以降を必要とします。 - DB2: 1 つの JDBC コールにつき、 1 つのステートメントしか送信できません。
- Oracle: 1 つの JDBC コールにつき、 1 つのステートメントしか送信できません。
1 つの DB ツールで複数のステートメントを使用する場合は、マジック トークンで分割する必要があります (DB2 と Oracle に制限があるためです)。たとえば、マジック トークン "GO"(デフォルト) で分割する次のクエリー文字列を入力する場合、それぞれ 2 つの SQL 文を含む 2 つの JDBC コールが送信されます。
create table pr88467(dkey int, svalue varchar(30)); insert into pr88467 (dkey,svalue) values (1,"A"),(2,"B"),(3,"C"); GO select * from pr88467; drop table pr88467;
ストアド プロシージャを作成したり呼び出したりするとき、マジック トークンによる分割を必ず使用し、ストアド プロシージャはそのグループ内で唯一のステートメントである必要があります。このことは、プロシージャを作成するときに重要です。なぜならプロシージャは通常はセミコロンを含んでおり、[セミコロン (’;’) でステートメントを分割] オプションを使用すると、それも削除されてしまうためです。また、プロシージャを呼び出すとき、呼び出すプロシージャが分割されている必要があります。なぜなら、DB ツールはそれらを検出し、 CallableStatement として、任意の出力パラメーターと一緒に、 JDBC ドライバーへ送信できる必要があるからです。例:
create or replace function pr83185_func2(s NUMBER) return SYS_REFCURSOR as mycursor SYS_REFCURSOR; begin open mycursor for select * from EMPLOYEES where SALARY > s; return mycursor; end; GO ? = call pr83185_func2(15000)
上記のステートメントは、 2 つの JDBC コールを発行します。
- 1 つ目はプロシージャを作成するもの
- 2 つ目はそのプロシージャを呼び出し、結果を取得するもの
[オプション] タブ
- SQL 例外時にテストは失敗: SQL 例外が発生したときに、ツールが失敗するべきかどうかを指定します。DB ツールの出力先として検証ツールを連結している場合、その検証結果がこのツールの成否を決めるので、この設定は適用されません。
- クエリー実行後にデータベースへの変更を自動コミット: 自動コミット モードを使用するかどうかを指定します。自動コミット モード (デフォルト) では、 SQL クエリーは自動的にデータベースに変更をコミットします。さもなければ、変更は接続を維持している間だけしか見ることができません。
クエリー実行後にデータベースへの変更をロールバック: ロールバックを有効にするかどうかを指定します。このオプションがオンにすると、変更は直ちに取り消されます。
自動コミットとロールバックについて
自動コミット モードはロールバック モードを無効にします。自動コミット モードがオンの場合、ロールバック モードは自動的に無効になります。データベースにツールの存続時間中だけ見ることができる変更を行う場合は、自動コミット モードをオフにします。ツールの使用中に変更を取り消す場合は、ロールバック オプションを使用します。
- XML 文字のエンコード: ツールの結果で XML 文字をエンコードするかどうかを指定します。デフォルトでは XML の値はユニコード文字としてエンコーディングされますが、以下のオプションを選択してエンコーディングを変更できます。
- XML 仕様がサポートするすべての Unicode 文字を保持するには [Unicode] を選択します。"<" や "&" といった成約のある XML 文字だけがエンコードされます。
- すべての ASCII 文字を保持するには [ASCII] を選択します。成約のある XML 文字に加えて、ASCII ではない Unicode 文字もエンコードされます。
- XML エンコーディングを無効にするには [なし] を選択します。成約のある XML 文字を含め、フィールド値の文字は最終文書でそのまま表現されます。
列名と値を分離: SOAtest が値から列名を分割するべきかどうかを決定します。人間が読むことが難しい出力を作成することになるので、デフォルトではオフになっています。
- 結果が 1 つしかない場合、単一結果フォーマットを使用: 出力された XML のフォーマットを決定します。このオプションがオンの場合、可能であれば結果は "<results>" XML タグにネストされません。複数の結果がある場合は、このオプションがオンであっても複数結果フォーマットが使用されます。
単一結果フォーマット:
<updatedRows>0</updatedRows>
複数結果フォーマット:
<results> <updatedRows>0</updatedRows> </results>
複数結果フォーマットと複数の結果:
<results> <updatedRows>0</updatedRows> <updatedRows>0</updatedRows> <updatedRows>0</updatedRows> </results>
ストアド プロシージャの JDBC OUT パラメーター型
[ストアド プロシージャの JDBC OUT パラメーター型] フィールドは、OUT パラメーターを取得する、または値を返す、ストアド プロシージャや関数を呼び出すことができます。通常の SQL クエリーや、OUT パラメーターを持たないストアド プロシージャを実行する場合は、このフィールドは空にします。
フィールドにリストするデータ型は、スペースまたはカンマで区切ることができ、型名は、java.sql.Types クラスのフィールド名に対応するか (http://docs.oracle.com/javase/8/docs/api/java/sql/Types.html)、または oracle.jdbc.OracleTypes クラスのフィールドに対応します (http://download.oracle.com/docs/cd/A97329_03/web.902/q20224/oracle/jdbc/OracleTypes.html)。見つからなかった場合は、oracle.jdbc.OracleTypes の中を検索します。ユーザーが提供した型名は JDBC CallableStatement.registerOutParameter() に渡されます。
例
IN パラメーターを 4 つ取得するストアド プロシージャを呼び出すには、次を使用します。
CALL MYPROC(XMLTYPE('<hello>Some XML</hello>'), 55, 'character large object', 'some text')
- 4 つのパラメーター (順番に Oracle XMLType、 INTEGER、 CLOB、VARCHAR) を取得するストアド プロシージャを呼び出すとします。2 番目 (INTEGER) と 4 番目 (VARCHAR) のパラメーターが OUT パラメーターと仮定します。この場合、 SQL クエリーのコンテンツは次のようになります。
CALL MYPROC(XMLTYPE('<hello>some XML</hello>'), ?, 'character large object', ?)
JDBC OUT パラメーター型のフィールドには、次のコンテンツが入ります。INTEGER, VARCHAR
- VARCHAR を返し、OUT INTEGER、 IN INTEGER、 Oracle XMLTYPE、 Oracle CLOB、 VARCHAR、 DATE の 5 つの OUT パラメーターを取得する関数を呼び出す場合は、次のような SQL クエリーになります。
? = CALL MYFUNCTION(XMLTYPE('<hello>Some XML</hello>'), 'character large object', ?, 33, ?, ?, ?, ?)
そして、 JDBC OUT パラメーター型のフィールドには、次のコンテンツが入ります。VARCHAR, INTEGER, SYS.XMLTYPE, CLOB, VARCHAR, DATE
上と同じ関数を呼び出し、いくつかの IN パラメーターにデータ ソース値を使用する場合、次を使用します。
? = CALL MYFUNCTION(XMLTYPE('${My CML Content Columna name}'), 'character large object', ?, ${Column Name 2}, ?, ?, ?, ?)
通常の SQL クエリーでするように、 DB ツールは関数の戻り値や OUT パラメーターを XML にシリアライズします。これによって、ユーザーは実行結果を見たり、XML Assertor や XML Data Bank といった XML 検証/抽出 ツールを連結したりすることができます。
戻り値や OUT パラメーターのいずれかが CURSOR 型の場合、 SOAtest はそれを JDBC ResultSet として処理します。そして通常のクエリー結果 と同じように、全体的な結果の XML 内にネストされた XML へシリアライズします。- 整数の IN パラメーターを取得し、CURSOR を返す関数を呼び出す場合、次を使用します。
? = CALL MYFUNC(15000)
そして、パラメーター型フィールドは次を含みます。CURSOR
CURSOR が返されるまたは OUT パラメーターの場合、 DB ツールは、 DB ツールの全体的な XML 出力の中に埋め込んだ ResultSet XML 形式でそれらを戻します。CURSOR に関連付く列名を含みます。注意:SQLException "Bigger type length than maximum" のようなメッセージを受信した場合、それは Oracle ドライバーのバグである可能性があります。この場合は、より新しいバージョンの Oracle JDBC ドライバーを使用してみてください。Parasoft は、ojdbc14.jar のバージョン 10.2.0.4 でこの問題が発生しないことを確認しています。
Oracle データ型の拡張
Oracle データベースは、さまざまな独自データ型に対応しています。 データベースがこれらのデータ型を利用している場合、JDBC classpath に適切な jar を追加する必要があります (設定パネルの [Parasoft] > [設定] > [JDBC ドライバー] )。たとえば、 Oracle は oracle.xdb.XMLType に対応しています。これは、特定の Oracle アプリケーションに付属している xdb.jar と xmlparserv2.jar で利用可能です。XML Developer's Kit (XDK) Java からも利用可能です。XML Developer's Kit (XDK) Java を入手するには、 http://www.oracle.com で Downloads をクリックし、XML Developer Kit のリンクをクリックします。任意のプラットフォームを選択してキットをダウンロードします。このキットはその他のファイルも含んでいますが、上に記載した 2 ファイルだけ必要です。
両方の jar が、設定パネルの [Parasoft] > [設定] > [Parasoft] > [JDBC ドライバー] で JDBC classpath に追加される必要があります。
PL/SQL とストアド プロシージャのサポート
ストアド プロシージャは今日のシステムのビジネス ロジックを推進しているため、システムの他のコンポーネントのように、ストアド プロシージャも検証する必要があります。Oracle データベースへのプロシージャ (関数、パッケージ、トリガー) も格納できます。これらのプロシージャは繰り返し呼び出すことができます。頻繁に実行する必要がある複雑なクエリーにとっては特に有効です。
Oracle データベースでは、 PL/SQL (Procedural Language/Structured Query Language) という、Oracle 独自の SQL データベース用の手続き型拡張言語が使用されます。他の SQL データベース管理システムは、似通った SQL 言語の拡張機能を提供しています。
次のイメージは、ストアド プロシージャを作成または置換するために DB ツールのクエリーを [SQL クエリー] タブで構成する方法のサンプルです。
次のイメージは、ストアド プロシージャを呼び出すための、 DB ツールのクエリーの構成方法のサンプルです。
Traffic Viewer でクエリー結果を確認
Traffic Viewer ツールが DB ツールに連結され、DB ツールで SELECT 文が実行されたとき、Traffic Viewer ツールのレスポンス エリアに DB クエリーの結果を含むテーブルが表示されます。
DB ツールが複数の SQL 文を実行し、 XML レスポンスが複数の結果セットを含む場合、メニューを使用してどの結果セットのトラフィックを表示するかを決めることができます。メニューは、複数の結果セットがある場合にテーブルの上部に表示されます。
以下の図では、Traffic Viewer ツールは結果セット 2 の結果を表示しています。