アプリケーションが頻繁に行う最初のタスクの 1 つに表のリストの表示があり、このリストから処理を行う表を 1 つまたは複数選択します。アプリケーションからデータベース・システム・カタログに対して独自の照会を発行して、このタイプのカタログ情報を入手することもできますが、最善の方法はその代わりにアプリケーションから DB2 CLI カタログ関数を呼び出すことです。このようなカタログ関数を使用すると、総称インターフェースが得られ、 DB2 ファミリーのサーバー全体に照会を発行し、一貫性のある結果セットを返すことができます。そうすれば、アプリケーションはサーバーに固有のものではなくなり、カタログ照会もリリース固有のものではなくなります。
カタログ関数を使用すると、ステートメント・ハンドルによってアプリケーションに結果セットが返されます。この関数を呼び出すことは、 SQLExecDirect() を使用してシステム・カタログ表に対して 1 つの選択を実行するのと概念的に同じです。この関数呼び出しの後で、アプリケーションは結果セットから個々の行を取り出すことができ、通常どおり SQLFetch() によって列データを処理します。 DB2 CLI カタログ関数は、次のとおりです。
この関数によって返される結果セットは、各カタログ関数の説明の部分で定義されています。列は、指定された順序で定義されます。今後のリリースでは、それぞれの結果セットの定義の末尾に他の列が追加される可能性があります。したがって、そのような変更の影響を受けないような方法で、アプリケーションを作成する必要があります。
カタログ関数の中には、非常に複雑な照会を実行する結果となるものがあるので、そのような関数は必要なときにのみ呼び出すようにしてください。返された情報をアプリケーションが保管するようにし、同じ情報を入手するために繰り返し呼び出しを行うことがないようにすることをお勧めします。
すべてのカタログ関数には、入力引き数リストに CatalogName および SchemaName (およびそれらに関連した長さ) があります。その他の入力引き数には、TableName、ProcedureName、または ColumnName (およびそれらに関連した長さ) があります。これらの入力引き数を使用して、返される情報の量を識別または制約します。ただし、 CatalogName は常にヌル・ポインター (長さは 0 に設定) でなければなりません。 DB2 CLI では現時点では 3 部分名がサポートされていないからです。
第 5 章, DB2 CLI 関数のカタログ関数の「関数の引き数」の項で、上記の入力引き数をそれぞれパターン値または普通の引き数のいずれかとして説明します。たとえば、SQLColumnPrivileges() は、 SchemaName および TableName を普通の引き数として扱い、 ColumnName をパターン値として扱います。
普通の引き数として扱われる入力はリテラルで、大文字小文字の区別が有効です。引き数は、照会を修飾はしませんが、ご希望の情報を識別します。この引き数にアプリケーションがヌル・ポインターを渡すとエラーになります。
パターン値として扱われる入力は、一致している行のみを含めることによって結果セットのサイズを制約するのに使用します。これは、基本照会を WHERE 文節で修飾した場合と同じです。パターン値入力についてアプリケーションがヌル・ポインターを渡すと、引き数は結果セットの制限に使用されません (つまり、WHERE 文節がない)。カタログ関数に複数のパターン値入力引き数があると、基本照会内の複数の WHERE 文節が AND で結合された場合と同じように扱われます。この結果セットでは、WHERE 文節のすべての条件を満たした場合に限り行が現れます。
各パターン値引き数には、次の文字が含まれています。
これらの引き数値は、WHERE 文節内の概念 LIKE 述部で使用されます。メタデータ文字 (_、%) をそのまま扱うには、エスケープ文字を _ または % の直前に入れなければなりません。エスケープ文字自体をパターンの一部として指定するためには、それを連続して 2 回入れます。アプリケーションは、 SQL_SEARCH_PATTERN_ESCAPE を指定した SQLGetInfo() を呼び出すと、エスケープ文字を判別することができます。
browser.c サンプル・アプリケーションでは、
browser.c サンプルの出力を下に示します。このサンプルに関連するセグメントは、カタログ関数ごとにリストされます。
Enter Search Pattern for Table Schema Name: STUDENT Enter Search Pattern for Table Name: % ### TABLE SCHEMA TABLE_NAME TABLE_TYPE ------------------------- ------------------------- ---------- 1 STUDENT CUSTOMER TABLE 2 STUDENT DEPARTMENT TABLE 3 STUDENT EMP_ACT TABLE 4 STUDENT EMP_PHOTO TABLE 5 STUDENT EMP_RESUME TABLE 6 STUDENT EMPLOYEE TABLE 7 STUDENT NAMEID TABLE 8 STUDENT ORD_CUST TABLE 9 STUDENT ORD_LINE TABLE 10 STUDENT ORG TABLE 11 STUDENT PROD_PARTS TABLE 12 STUDENT PRODUCT TABLE 13 STUDENT PROJECT TABLE 14 STUDENT STAFF TABLE Enter a table Number and an action:(n [Q | C | P | I | F | T |O | L]) |Q=Quit C=cols P=Primary Key I=Index F=Foreign Key | |T=Tab Priv O=Col Priv S=Stats L=List Tables | 1c Schema: STUDENT Table Name: CUSTOMER CUST_NUM, NOT NULLABLE, INTeger (10) FIRST_NAME, NOT NULLABLE, CHARacter (30) LAST_NAME, NOT NULLABLE, CHARacter (30) STREET, NULLABLE, CHARacter (128) CITY, NULLABLE, CHARacter (30) PROV_STATE, NULLABLE, CHARacter (30) PZ_CODE, NULLABLE, CHARacter (9) COUNTRY, NULLABLE, CHARacter (30) PHONE_NUM, NULLABLE, CHARacter (20) >> Hit Enter to Continue<< 1p Primary Keys for STUDENT.CUSTOMER 1 Column: CUST_NUM Primary Key Name: = NULL >> Hit Enter to Continue<< 1f Primary Key and Foreign Keys for STUDENT.CUSTOMER CUST_NUM STUDENT.ORD_CUST.CUST_NUM Update Rule SET NULL , Delete Rule: NO ACTION >> Hit Enter to Continue<<