X/Open SQL CAE 仕様では、エスケープ文節を、『ベンダー固有の SQL 拡張機能を、標準化された SQL の枠組みの中で実装するための構文上の機構』として定義しています。 DB2 CLI と ODBC の両方とも、X/Open で定義されているベンダー・エスケープ文節をサポートしています。
現在では、エスケープ文節は、SQL 拡張を定義するために ODBC によって広く使用されています。 DB2 CLI は、ODBC 拡張を正しい DB2 構文に変換します。 SQLNativeSql() 関数を使用して、その結果の構文を表示することができます。
アプリケーションが DB2 データ・ソースだけにアクセスする場合は、エスケープ文節を使用する必要はありません。アプリケーションが同じサポートを備えている他のデータ・ソースにアクセスしようとする際に、別の構文を使用していれば、エスケープ文節を使うとアプリケーションの可搬性が高くなります。
DB2 CLI は、エスケープ文節に標準構文と短縮構文の両方を使用してきましたが、標準構文は (DB2 CLI はサポートはしていますが) 使用すべきでないものとされています。標準構文を使用したエスケープ文節は、次の形式を取っていました。
--(*vendor(vendor-identifier), product(product-identifier) extended SQL text*)--
アプリケーションでは、現在では短縮構文 (以下に説明しています) だけを使用してください。最新の ODBC 標準に付いていくためです。
エスケープ文節の定義の形式は次のとおりです。
{ extended SQL text }
これによって、以下の SQL 拡張子を定義します。
日付、時刻、およびタイム・スタンプのデータの ODBC エスケープ文節は、次のとおりです。
{d 'value'} {t 'value'} {ts 'value'}
たとえば、次のステートメントを使用して、 EMPLOYEE 表に対する照会を発行することができます。
SELECT * FROM EMPLOYEE WHERE HIREDATE={d '1994-03-29'}
DB2 CLI は、上記ステートメントを DB2 形式に変換します。 SQLNativeSql() を使用して、変換されたステートメントを返すことができます。
日付、時刻、およびタイム・スタンプのリテラルの ODBC エスケープ文節は、 C データ・タイプの SQL_C_CHAR を指定した入力パラメーターで使用することができます。
外部結合の ODBC エスケープ文節は、次のとおりです。
{oj outer-join}
outer join は次のとおりです。
table-name {LEFT | RIGHT | FULL} OUTER JOIN {table-name | outer-join} ON search-condition
たとえば、DB2 CLI が次のステートメントを変換する場合を考慮します。
SELECT * FROM {oj T1 LEFT OUTER JOIN T2 ON T1.C1=T2.C3} WHERE T1.C2>20
これは IBM の形式に変換され、その形式は SQL92 外部結合構文に対応します。
SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.C1=T2.C3 WHERE T1.C2>20
注: | すべての DB2 サーバーで外部結合がサポートされているわけではありません。現行サーバーが外部結合をサポートしているかどうかを判別するには、 SQL_SQL92_RELATIONAL_JOIN_OPERATORS および SQL_OJ_CAPABILITIES オプションを指定して、SQLGetInfo() を呼び出します。 |
SQL LIKE 述部では、メタキャラクター % がゼロ個以上の任意の文字に相当し、メタキャラクター _ が任意の 1 文字に相当します。 ESCAPE 文節を利用すると、実際のパーセント文字および下線文字を含む値に相当するようにパターンの定義を行うことができ、この場合はその文字の前にエスケープ文字を入れます。 LIKE 述部のエスケープ文字を定義するのに ODBC が使用するエスケープ文節は、次のとおりです。
{escape 'escape-character'}
escape-character は、エスケープ文節の使用の基準となる DB2 規則でサポートされている任意の文字です。
さまざまなベンダー DBMS 製品間の可搬性には関係のないアプリケーションの場合、 ESCAPE 文節を直接そのデータ・ソースへ渡す必要があります。特定の DB2 データ・ソースで LIKE 述部エスケープ文字がサポートされる時点を判別するには、アプリケーションで SQL_LIKE_ESCAPE_CLAUSE 情報タイプを指定して SQLGetInfo() を呼び出してください。
ストアード・プロシージャーを呼び出す場合の ODBC エスケープ文節は、次のとおりです。
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
プロシージャーにはゼロ個以上のパラメーターがあります。 (角大括弧 ([ ]) は、オプションの引き数を表します。)
ODBC は、任意指定パラメーター ?= がプロシージャーの戻り値を表すように指定します。戻り値があれば、SQLBindParameter() によって定義される最初のパラメーター・マーカーによって指定された場所に保管されます。 ?= がエスケープ文節にあると、 DB2 CLI は SQLCODE をプロシージャーの戻り値として戻します。 ?= がない場合、アプリケーションは SQLGetSQLCA() 関数を使用して SQLCA を検索することができます。 ODBC とは異なり、DB2 CLI はプロシージャー引き数としてリテラルをサポートしてはいないため、パラメーター・マーカーを使用します。
ストアード・プロシージャーに関する詳細については、 ストアード・プロシージャーの使用またはアプリケーション開発の手引き を参照してください。
たとえば、DB2 CLI が次のステートメントを変換する場合を考慮します。
{CALL NETB94(?,?,?)}
これは、次の内部 CALL ステートメント形式に変換されます。
CALL NEBT94(?, ?, ?)
ストリングの長さ、サブストリング、またはトリムなどのスカラー関数を、結果セットの列や、結果セットの行を制限する列で使用することができます。スカラー関数の ODBC エスケープ文節は次のとおりです。
{fn scalar-function}
ここで、 scalar-function は 付録 D, 拡張スカラー関数にリストされている関数です。
たとえば、DB2 CLI が次のステートメントを変換する場合を考慮します。
SELECT {fn CONCAT(FIRSTNAME,LASTNAME)} FROM EMPLOYEE
これを次のように変換します。
SELECT FIRSTNAME CONCAT LASTNAME FROM EMPLOYEE
SQLNativeSql() を呼び出して、変換された SQL ステートメントを得ることができます。
どのスカラー関数が、特定の接続ハンドルで参照される現行サーバーによってサポートされているかを判別するには、 SQLGetInfo() を、 SQL_NUMERIC_FUNCTIONS、SQL_STRING_FUNCTIONS、 SQL_SYSTEM_FUNCTIONS、および SQL_TIMEDATE_FUNCTIONS オプションを指定して呼び出してください。