Tivoli Service Desk 6.0 Developer's Toolkit Script 言語解説書
メイン・ページに戻る
トランザクションを開始します。
FUNCTION SQLBeginWork: INTEGER;
TSD Script は通常、すべての SQL ステートメントをその正常終了時にコミットします。 ただし、一連の SQL ステートメントを同時にコミットまたはロールバックさせたい時が あります。SQLBeginWork は、SQLCommit または SQLRollBack が 呼び出されるまで、すべての SQL ステートメントの自動コミットを休止します。
コミットまたはロールバックの後で、トランザクションは終了し、TSD Script は 自動コミットを再開します。別のトランザクションを開始するためには、再び SQLBeginWork を 呼び出す必要があります。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES
ok : BOOLEAN; ACTIONS
(* トランザクション (トランザクション) の開始 ==> これはどの SQL 操作後でも通常の自動コミットを使用不可にします *) SQLBeginWork;
(* ここから作業を実行 ok := .... *)
IF ok THEN SQLCommit; (* SQLBeginWork 以後の変更を保管 *) ELSE SQLRollBack; (* SQLBeginWork 以後の変更を取り消し *) END;
(* コミットまたはロールバック後にトランザクションは 終了します。*) (* 自動コミットを望まない場合には、SQLBeginWork を再び呼び出して *) (* 次のトランザクションを開始 *) (* want the automatic committing *)
END; --Test--
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
オープンしているカーソルと準備済みステートメントをクローズし、オープンしている DBMS 接続を切断します。
FUNCTION SQLCloseAll: INTEGER;
必須ではありませんが、メイン .kb ファイルを終了する前にこのルーチンを呼び出してください。 そうすると、進行中のトランザクションがすべてコミットされます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS ACTIONS (* いくつかの SQL 操作を実行します... *)
SQLCloseAll; END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
SQLSelect の呼び出しによって前にオープンされたカーソルをクローズします。
FUNCTION SQLCloseCursor(cursor: SQLCURSOR): INTEGER;
注意: ロールバック操作 はすべてのカーソルをクローズします (SQLRollBack を参照)
ほとんどのドライバーでは、複数の作業単位にまたがる可能性のあるカーソルを指定することは できません (たとえば、WITH HOLD で宣言するなど)。例外は DB2 CLI ドライバーです。コミット操作 後に、すべてのカーソルがクローズされます。したがって、取り出しループ内で SQL 操作 (更新など) を 実行する場合には、どの SQL ステートメントの後でも自動コミットを使用不可にする必要があります。
注: コミット またはロールバック操作を実行する前に、すべてのカーソルをクローズしてください
引き数名 | 説明 |
cursor | これは、SQLSelect に対する前の呼び出して設定された、タイプ SQLCursor のパラメーターです。 |
完了時に、SQLCloseCursor はカーソルを $Unknown に設定します。前にクローズされている カーソルがあるのに SQLCloseCursor を呼び出すと、これはエラーで終了します。エラー・メッセージ は表示されません。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; retCd: INTEGER; ACTIONS (* すべての従業員を選択 *) retCd := SQLSelect(cursor,'* from emp'); IF (retCd < 0) THEN EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* この行に基づいていくつかの操作を実行...
. . . *)
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END;
(* カーソルをただちにクローズ *) SQLCloseCursor(cursor);
END;
戻りコード | 説明 |
1 | カーソルは正常にクローズされました |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
前に SQLPrepare によってオープンされた (準備された) ステートメントをクローズします。
FUNCTION SQLCloseStatement(statement: SQLSTATEMENT): INTEGER;
ロールバック操作は、準備されたステートメントをすべて破棄します。コミット操作は、 準備されたステートメントのうち、オープンしているカーソルを参照していないものをすべてクローズします。
注: コミットまたは ロールバックを実行する前に、SQLCloseStatement を使って、影響を受けるすべてのステートメントを 手動でクローズしてください
引き数名 | 説明 |
statement | statement パラメーターは、SQLPrepare を呼び出すと初期化されます |
SQLCloseStatement はすべてのドライバーによってサポートされます。完了時に、 SQLCloseStatement はそのステートメントを $Unknown に設定します。
前にクローズされているステートメントがあるのに SQLCloseStatement を呼び出すと、 これはエラーで終了します。エラー・メッセージは表示されません。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd: INTEGER; ACTIONS SQLBeginWork
(* 渡されたユーザー名を挿入 *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* トランザクションを終了 *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF retCd < 0 THEN SQLCloseStatement(stmt); SQLRollBack; (* 変更を取り消してロックを解除 *) EXIT retCd; END; END; (* for *)
(* 準備されたステートメントをクローズ *) SQLCloseStatement(stmt); SQLCommit; (* 変更を保管してロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
処理系依存の非 SQL コマンドを SQL インタープリターに出します。
FUNCTION SQLCommand(sub_command: STRING): INTEGER;
引き数名 | 説明 |
sub_command | コマンド・ストリングは 2 つの部分、すなわちデータベース管理プログラム・サブコマンドである第 1 の部分と、このコマンドのパラメーターを含む第 2 の部分とから構成されます。コマンドに大文字小文字の区別はありません。すべてのパラメーターは空白文字で区切られます。使用可能なサブコマンドについては、次のセクションを参照してください。 |
テーブルに示すように、SQLCommand ステートメントには多数のサブコマンドがあります。
いくつかのサブコマンドには connection_handle_string が必要です。現在選択されている ソース・データベースを指定するためには、$Current を渡すことができます。あるいは、 何も指定しなければ、現在選択されているソース・データベースが使用されます。
接続ハンドル・ストリングを取得するためには、サブコマンド GET CURRENT CONNECTION を 使って SQLCommand を呼び出してください。そうすると、整数戻り値をストリングに 割り当てることができます。このストリングは connection_handle_string です。
また、source_name を指定するサブコマンドがいくつかあります。(ソース名パラメーター はいつでも任意選択です。) 現在接続されているソースを指定するためには、$Current を 渡すことができます。デフォルトのデータ・ソースを指定するためには、$Default を渡す ことができます。ソース名が指定されていないと、$Current が使用されます。
次の表は、SQLCommand のサブコマンド ('<sub_command>') と
そのパラメーターおよび説明を示したものです。「パラメーター」欄の値はユーザーが指定する
ものです。
サブコマンド | パラメーター | 説明 |
CONNECT | connect_string | DBMS との接続をオープンします。このコマンドは、どの SQL 操作よりも前に呼び出さなければなりません。これは通常、アプリケーションによって最初に呼び出されるステートメントのうちの 1 つです。connect_string が指定されないと、デフォルトのデータ・ソースに接続されます。接続が正常に完了すると、これが現在選択されている接続になります。 |
DISCONNECT | connection_handle_string | connection_handle_string によって参照された接続から切断します。 接続ハンドルは、接続の直後に SQLCommand (GET CURRENT CONNECTION) を呼び出すことによって取得できる整数です。 |
GET CASE CONVERSION | source_name | オブジェクト名の (データのではない) 大文字小文字変換モードを戻します: 0 = なし 1 = 大文字 2 = 小文字 負の戻りコードはエラーを示します。 |
GET CASE SENSITIVITY | source_name | Tivoli Service Desk Developer's Toolkit に、DBMS が大文字小文字の区別のあるオブジェクト名 (テーブル名や列名など) を持っているかどうかを通知します。これはデータには適用されません (ただし、SQLServer など一部の DBMS では、大文字小文字の区別のあるオブジェクト名と大文字小文字の区別のあるデータが共存しています)。 可能な戻り値は次のとおりです。 0 = 大文字小文字を区別しない 1 = 大文字小文字を区別する |
GET CATALOG CASE CONVERSION | source_name | システム・カタログ・テーブル内のデータに対する現在の大文字小文字変換モードを戻します: 0 = なし 1 = 大文字 2 = 小文字 負の戻り値はエラーを示します。 |
GET CHECK DRIVER | source_name | ドライバー (たとえば CDSS06.DLL) がサポートされていないドライバーの 1 つであるかどうかを調べる検査が (接続時に) 行われる場合には TRUE を戻し、そうでない場合には FALSE を戻します。 |
GET CURRENT CONNECTION | source_name | 現在選択されている接続の整数接続ハンドルを戻します。ゼロより小さい戻りコードを受け取った場合には、詳細について SQL エラー・コードの定義ページを参照してください |
GET CURRENT ODBC HENV | Tivoli Service Desk Developer's Toolkit が使用する実際の ODBC 環境ハンドルを戻します。これは、ODBC ドライバーを使用している時にだけ適用されます。 負の戻り値はエラーを示します。 | |
GET CURRENT ODBC HDBC | Tivoli Service Desk Developer's Toolkit の現行 1 次接続の実際の ODBC 接続ハンドルを戻します。これは、ODBC ドライバーを使用している時にだけ適用されます。負の戻り値はエラーを示します。 | |
GET DATE FORMAT | source_name | DBMS の現行日付形式を戻します。 |
GET DBMS | source_name | source_name という名前のソースの DBMS の整数コードを戻します。 可能な戻り値は次のとおりです: 0 または 2 (DB2/); 1 (Oracle); 3、23、または 24 (SQLServer); 4 または 12 (SYBASE); および 16 または 17 (INFORMIX)。 |
GET IN TRANSACTION | connection_handle | 進行中のトランザクションがある場合 (言い換えれば、SQLBeginWork が呼び出され、SQLCommit または SQLRollback がまだ呼び出されていない場合) には、1 を戻します。戻りコード 0 は、進行中のトランザクションがないことを示します。負の戻りコードはエラーを示します。 |
GET MODULE | 使用している SQL ライブラリーの整数コードを戻します。これは後方互換性にだけ備えるものです。 モジュール・コードの使用可能な値は次の通りです。 2 = (マルチプラットフォーム - X/OPEN および ODBC)。 | |
GET MODULE TYPE | 現行モジュール・タイプを戻します。これは後方互換性にだけ備えるものです。使用可能な値は次の通りです。 5 = X/OPEN 注: GET MODULE が後方互換性のために ODBC を Q+E バージョン 2 にマップすることを除けば、これは GET MODULE サブコマンドに類似しています。 |
|
GET MULTI CONNECT | source_name | source_name という名前のソースが複数の同時接続をサポートしている場合には、1 を戻します。 |
GET SHOW WARNINGS | source | 警告のメッセージ・ボックスが使用可能になっている場合には TRUE を戻し、そうでない場合には FALSE を戻します。 |
GET TIME FORMAT | source_name | DBMS の現行時刻形式を戻します。 |
GET UPDATE LOCK STYLE | source_name | 現行ロック・スタイルを戻します: 0 = なし 1 = 更新のための選択 2 = 更新 負の戻りコードはエラーを示します。 |
GET UPDATE MODE | source_name | 受動並行性更新モードを戻します。使用可能な値は次の通りです。 0 = なし 1 = 選択 2 = DBMS 最適 負の戻りコードはエラーを示します。 |
RESTORE CURRENT QUALIFIER | 内部スタック上の最新保管修飾子の値を取り出し、それを現行接続の現行修飾子にします。 | |
RESTORE CURRENT SYSQUALIFIER | 内部スタック上の最新保管システム・テーブル修飾子の値を取り出し、それを現行接続の現行システム修飾子にします。 | |
SAVE CURRENT QUALIFIER | 現行接続の現行テーブル修飾子の値を内部スタックに保管します。 | |
SAVE CURRENT SYSQUALIFIER | 現行接続の現行システム・テーブル修飾子の値を内部スタックに保管します。 | |
SET CASE CONVERSION | conversion | オブジェクト名の (データのではない) 大文字小文字変換モードを設定します。 conversion に有効な値は次のとおりです: NONE、UPPER、および LOWER。 |
SET CASE SENSITIVITY | true | false | Tivoli Service Desk Developer's Toolkit に、現行 DBMS が大文字小文字の区別のあるオブジェクト名 (テーブル名や列名など) を持っているかどうかを通知します。これはデータには適用されません (ただし、SQLServer など一部の DBMS では、大文字小文字の区別のあるオブジェクト名と大文字小文字の区別のあるデータが調和しています)。 |
SET CATALOG CASE CONVERSION | conversion | システム・カタログ・テーブル内のデータに対する現在の大文字小文字変換モードを設定します。conversion に有効な値は UPPER、LOWER、および NONE です。 |
SET CHECK DRIVER | true | false | ドライバー妥当性検査を行うための現行状態を設定します。 |
SET CONNECTION | connection_handle_string | 現在選択されている接続を、connection_handle_string によって参照されたハンドルに設定します。 |
SET CURRENT QUALIFIER | qualifier | テーブル修飾子を、現在選択されている接続の修飾子に設定します。 |
SET CURRENT SYSQUALIFIER | qualifier | システム・テーブル修飾子を、現在選択されている接続の修飾子に設定します。 |
SET DBMS | dbms | 現在認識されている DBMS をオーバーライドすることができます。(DBMS 値のリストについて、 GET DBMS を参照してください。) |
SET SHOW WARNINGS | true | false | 警告メッセージ・ボックスを表示するための現行状態を設定します。 |
SET UPDATE LOCK STYLE | style | 現行ロック・スタイルをローカルで設定することができます。style に有効な値は次のとおりです: NONE、SELECT FOR UPDATE、および UPDATE。 |
SET UPDATE MODE | none | select | dbms_optimistic | Tivoli Service Desk Developer's Toolkit に、受動並行性の実行方法を通知します: NONE - オリジナル・レコードはデータベースと比較されません。SELECT - そのレコードの SQL 選択を実行し、そのレコードを受動並行性手法で使用されるオリジナル・レコードと比較して、そのレコードの DBMS バージョンが変わっているかどうかを検出します。 DBMS_OPTIMISTIC - DBMS 固有の受動並行性手法を使用して、そのレコードの DBMS バージョンが変わっているかどうかを検出しようと試みます。 |
START USING DATABASE | database_name | このコマンドは、現在アクティブになっているデータベースを database_name に切り替えます。 |
TRACE ALERT DESTINATION | ファイル名 | トレース・タイマーによって生成されるアラート・メッセージの宛先ファイルを設定します。 これが使用されると、情報は指定されたファイルに付加されます。デフォルトでは、このファイルに sql_trc.alr という名前が付けられます。 注: 情報は既存のファイルに付加されます。これは TRACE FILE コマンドとは異なります。 TRACE FILE コマンドの場合には、情報は指定されたファイルに合わせて切り捨てられます。 |
TRACE AUTO FLUSH | true | false | TRACE AUTO FLUSH が TRUE に設定されると、トレース・ファイルへの出力は書き込みのたびにフラッシュされます (ディスクに書き込まれます)。通常、ログへの出力がディスクに書き込まれるのは、トレースが完了した時か、オペレーティング・システムがバッファーをフラッシュすることに決めた時だけです。 オペレーティング・システムに障害があると、トレース情報の一部または全部が失われることがあります。TRACE AUTO FLUSH コマンドは情報をファイルに強制的に書き込むので、オペレーティング・システムに障害が起こっても出力は失われません。デフォルト値は TRUE です。 注: ファイル・アクセスが頻繁になるので、パフォーマンスが低下する可能性があります。 |
TRACE ENABLED | true | false | トレースが使用可能であるか使用不可であるかを決定します。TRACE ENABLED が存在しないと、デフォルト値は FALSE です。 |
TRACE FILE | ファイル名 | トレース・ファイル出力を指定されたファイルに入れます。付加が指定されていなければ、トレースを開始するたびにこのファイルは切り捨てられます (TRACE APPEND を参照)。 TRACE_FILE パラメーターが指定されていないと、デフォルトのトレース・ファイル (sql_trc.log) が現行ディレクトリーに作成されます。 |
TRACE FILE APPEND | true | false | TRUE が渡されると既存のトレース・ファイルが付加され、FALSE が渡されると既存のファイルが上書きされます。いずれの場合にも、トレース・ファイルは存在しない時に作成されます。デフォルトは FALSE です。 |
TRACE INDENT INCR | 整数 | ネストされたブロックの字下げに使用されるスペースの数をコントロールします。デフォルトは 4 個のスペースです。 |
TRACE MAX LINE LENGTH | 整数 | 折り返しが起こる前の出力トレース・ファイルの行の最大長を設定します。デフォルトは 2000000000 で、事実上折り返しを使用不可にします。 |
TRACE MAX NUM FETCHES | 整数 | ログ・ファイルに記録される結果セット行の数を設定します。 これは、SQLPrepare/SQLExecute 組み合わせを使用した時に記録される実行回数でもあります。デフォルトは 3 です。 |
TRACE MAX PARAMETER SIZE | 整数 | ALL | NONE | SQL コマンドから結果が戻された場合にログ・ファイルに出力されるデータの量 (列当たりのバイト数) を設定します。ALL を指定した場合には、常にステートメント全体が書き込まれます。 NONE を指定すると、列データ・トレースが使用不可になり、結果のデータは記録されません。0 を指定すると、列名がログに現れますが、データは記録されません。
TRACE MAX PARAMETER SIZE のデフォルト値は 256 バイトです。 |
TRACE MAX STATEMENT SIZE | 整数 | ALL | ログ・ファイルに記録される出力のサイズの限界を設定します。ALL を指定した場合には、ステートメント全体が切り捨てられることなく記録されます。デフォルトは 1024 バイトです。 |
TRACE MSG | メッセージ・テキスト | メッセージ・テキストをトレース・ログ・ファイルに入れます。 |
TRACE SEPARATOR | ストリング | デフォルト "==>" の代わりにユーザー指定ストリングを使用することができます。 これを使用すると、トレース出力内のブロックが素早く突き止められます。 |
TRACE START TIMER | タイマー名 [/i=字下げスペース] [/a=ミリ秒] [/q] | 固有の識別子が指定されたタイマーを開始します。これは、参照点を示すためにログ・ファイルに表示されます。/i パラメーターは、時間間隔を通じてイベントを記録する字下げレベル (スペースの数) をコントロールします。/i のデフォルトは 0 です。 /a パラメーター (任意選択) は、アラートを出す前に時間間隔の上限を可能にします。 /q パラメーター (任意選択) は、ログ・ファイル出力を伴わない静止モード出力に使用されます。 /q が存在しないと、出力は通常ファイルに記録されます。 注: SQL 初期化では TRACE_START_TIMER が暗黙的に呼び出されます。 |
TRACE STATEMENTS | これは記録されるステートメント・タイプのリストで、それぞれがプラス (+) 符号で区切られます。 事実上ログ記録を使用不可にするためには、フラグを NONE に設定します。 デフォルトは ALL です。 | |
TRACE STOP TIMER | タイマー名 | 対応する TRACE_START_TIMER 呼び出して開始されたタイミング・セッションを終了します。(固有のタイマー名が大文字小文字の区別なしで突き合わせられます。) タイミング・セッションが終了すると、ログ・ファイルへの出力を抑止する /q (静止) が (TRACE START TIMER で) 使用されていなければ、字下げレベルがリセットされ、タイミング結果が記録されます。 注: SQL 初期化解除 (SQLCloseAll またはプログラム終了) では TRACE STOP TIMER が暗黙的に呼び出されます。 |
WRITE LAST ERROR MSG | file_name | 最後の DBMS エラー・メッセージを file_name に書き込みます。これは、 Tivoli Service Desk Developer's Toolkit によって生成されたエラー・メッセージ (たとえば、 INVALID CURSOR HANDLE など) を書き込むものではありません。 |
環境変数 SAISQLTRCFILE および SAISQLTRCENABLED を使ってトレース・オプションのサブセット を設定することができます。
SAISQLTRCFILE は、トレース・ファイルの名前を設定します。たとえば、この環境変数をコマンド行 から設定するには、次のように入力することができます。
SET SAISQLTRCFILE=c:\trc\trc.log
SAISQLTRCENABLED は、SQL トレースを使用可能または使用不可にします。たとえば、この環境変数をコマンド行 から設定するには、次のように入力することができます。
SET SAISQLTRCENABLED=TRUE
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER IS VARIABLES connectionHandle, retCd, dbms, module, caseSensitive, caseConvert: INTEGER;
ACTIONS (* データ・ソースに接続 *) retCd := SQLCommand('CONNECT SOURCE=ADV_ORACLE;QUAL= EXAV;UID=TIM;');
IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続ハンドルを取得 *) connectionHandle := SQLCommand ('GET CURRENT CONNECTION'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続を設定 *) ret := SQLCommand ('SET CONNECTION' & connectionHandle); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続から切断 *) retCd := SQLCommand ('DISCONNECT'); IF (retCd < 0) THEN EXIT retCd; END;
(* 指定された接続から切断 *) retCd := SQLCommand ('DISCONNECT' & connectionHandle); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行 DBMS タイプを取得 *) dbms := SQLCommand ('GET DBMS'); IF (retCd < 0) THEN EXIT retCd; END;
(* 特定のデータ・ソースの DBMS タイプを取得 *) dbms := SQLCommand ('GET DBMS TEST'); IF (retCd < 0) THEN EXIT retCd; END;
(* SAI_SQL.DLL モジュール・タイプを取得 *) module := SQLCommand ('GET MODULE'); IF (retCd < 0) THEN EXIT retCd; END;
(* DBMS が大文字小文字の区別をしているかどうかを取得 *) caseSensitive := SQLCommand ('GET CASE SENSITIVITY'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行大文字小文字変換モードを取得 *) caseConvert := SQLCommand ('GET CASE CONVERSION'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続の現行大文字小文字変換モードを設定 *) ret := SQLCommand ('SET CASE CONVERSION upper'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続の現行修飾子を保管 *) ret := SQLCommand ('SAVE CURRENT QUALIFIER'); IF (retCd < 0) THEN EXIT retCd; END;
(* 命名された ADVISOR の日付形式を取得 *) ret := SQLCommand('GET DATE FORMAT ADVISOR'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現在接続されているソースの時刻形式を取得 *) ret := SQLCommand('GET TIME FORMAT'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続の現行修飾子を設定 *) ret := SQLCommand('SET CURRENT QUALIFIER Fred'); IF (retCd < 0) THEN EXIT retCd; END;
(* 現行接続の現行修飾子を復元 *) ret := SQLCommand('RESTORE CURRENT QUALIFIER'); IF (retCd < 0) THEN EXIT retCd; END;
(* データベースの切り替え *) ret := SQLCommand('START USING DATABASE advisor'); IF (retCd < 0) THEN EXIT retCd; END;
END; --Test--
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
次のものについては、Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照してください。
SQL Commit Work コマンドを SQL インタープリターに出し、その結果として、 このトランザクション中に行われたすべての変更を受け入れます。
FUNCTION SQLCommit: INTEGER;
準備されたステートメントがオープン・カーソルを参照していない場合には、コミットによってそのステートメントは クローズされます。コミットを実行する前に、準備されたステートメントをすべて手動でクローズしてください。
ほとんどのドライバーでは、複数の作業単位にまたがる可能性のあるカーソルを指定することは できません (たとえば、WITH HOLD で宣言するなど)。例外は DB2 CLI ドライバーです。コミット操作 後に、すべてのカーソルがクローズされます。したがって、取り出しループ内で SQL 操作 (更新など) を 実行する場合には、どの SQL ステートメントの後でも自動コミットを使用不可にする必要があります。
注: コミット またはロールバック操作を実行する前に、すべてのカーソルをクローズしてください
TSD Script は通常、どの SQL ステートメントも、それが完了した時点でコミットします。ただし、1 つの トランザクション内で 1 群の SQL ステートメントを実行している場合には、SQLCommit または SQLRollBack を 使って手動でそのトランザクションをコミットまたはロールバックしなければなりません。
SQLCommit (または SQLRollBack) が呼び出されると、現行トランザクションは終了し、 自動コミットが再開されます。別のトランザクションを開始するためには、改めて SQLBeginWork を 呼び出す必要があります。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* 各種 *) retCd : INTEGER; ACTIONS (* トランザクションの開始 *) SQLBeginWork;
(* 渡された年齢より高齢のすべての従業員を削除 *) retCd := SQLDelete('emp','age > ' & age); IF retCd < 0 THEN SQLRollBack; (* このトランザクションを終了 *) EXIT retCd; END;
(* 変更をコミットしてロックを解除 *) SQLCommit; END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
検索基準を含むフィールドを持つレコードがあれば、SQLCreateSearchString は 有効な SQL WHERE 文節 (WHERE なし) を作成します。
FUNCTION SQLCreateSearchString(VAL tableName: STRING, REF searchString: STRING, VAL searchRec: any record or list of any record): INTEGER;
大文字小文字を区別しない検索を実行すると、TSD Script は自動的に該当する Upper 関数 を呼び出します。ほとんどの場合、この検索は索引を使用しません。検索で索引を使用するためには、 大文字小文字区別演算子を指定してください。
引き数名 | 説明 |
tableName | 検索するテーブルまたはビュー |
searchString | これは、SQLCreateSearchString が生成する検索ストリングを含みます。 |
searchRec | このパラメーターは、単一のレコードまたは検索基準を含むレコードのリストのいずれかです |
SQLCreateSearchString は、渡されたレコード (またはレコードのリスト) の内容に 基づいて WHERE 文節を作成するために使用されます。レコードのリストが渡された場合には、 各リスト要素から生成された文節が OR 論理演算子で結合されます。1 レコード内では、 各フィールドから生成された文節が AND 論理演算子で結合されます。
SQLCreateSearchString については次の点に注意してください。
値 | 説明 |
(なし) | 「照会」画面で演算子が指定されないと、大文字小文字を区別する検索が実行されます。これは、索引の使用を考慮したものです。 |
= | 大文字小文字を区別しない等号 (演算子フィールドが存在していないか、または $Unknown:database:querying である場合に使用されます)。 |
> | 大文字小文字を区別しない右不等号。 |
< | 大文字小文字を区別しない左不等号。 |
>= | 大文字小文字を区別しない等価右不等号。 |
<= | 大文字小文字を区別しない等価左不等号。 |
<> | 大文字小文字を区別しない非等号。 |
== | 大文字小文字を区別する等号。 |
>> | 大文字小文字を区別する右不等号。 |
<< | 大文字小文字を区別する左不等号。 |
>= | 大文字小文字を区別する等価右不等号。 |
<= | 大文字小文字を区別する等価左不等号。 |
<<>> | 大文字小文字を区別する非等号。 |
IS NULL | その列が現在 NULL ならば TRUE。IS NULL 演算子を使用すると、対応する列フィールドの値は無関係になります。ただし、 その列に対応するフィールドは存在していなければなりません。 |
IS NOT NULL | その列が現在 NULL でないならば TRUE。IS NOT NULL 演算子を使用すると、対応する列フィールドの実際の値は無関係になります。ただし、 その列に対応するフィールドは存在していなければなりません。 |
_LO および _HI 接尾部は、そのフィールドの下限値および上限値を示します。たとえば、 age がテーブルのある列に対応するフィールドであって、age_lo が 21 に等しく、 age_hi が 65 に等しい場合には、次の検索基準が生成されます。
'(age >= 21) AND (age <= 65)'. s:
_LO および _HI 限界演算子を使用すると、対応する列フィールドの値は無関係になります。ただし、 その列に対応するフィールドは存在していなければなりません。
_LO または _HI 限界演算子が存在していないか、または $Unknown であると、 限界機能は使用不可になり、対応する列フィールドの値が使用されます。_OP 演算子フィールド が存在していて、その値が <> であると、限界演算子は > および < に なります。そうでなければ、デフォルト (>= および <=) が使用されます。
列がストリング・タイプの場合には、* および ? ワイルドカード文字を使用して ワイルドカード検索を行なうことができます。
内部的には、* および ? ワイルドカード文字は、% および _ に一致する SQL LIKE 文節に 変換されます。_OP 演算子フィールドが存在していて、その値が <> の場合には、検索基準と 一致しない行が選択されます (すなわち、NOT LIKE 文節が生成されます)。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS
TYPES SearchRecord IS RECORD ssn: INTEGER; title: STRING; title_op: STRING; salary: REAL; age_lo:integer; age_hi:integer; age_op:string; name: STRING; name_lo:string; name_hi:string; name_op:string; age: INTEGER; married: BOOLEAN; MARRIED_OP:STRING; rating: REAL; addr: STRING; addr_OP: STRING; bDate: DATE; bTime: TIME; sysDT: STRING; sysDT_op: STRING; END; (* SearchRecord *)
VARIABLES r : SearchRecord; searchString : STRING; cursor: SQLCursor; ret : INTEGER;
ACTIONS
(* これらの値は通常はカスタム・ダイアログ・ボックスから来ます。*)
r.title_op := '<>'; r.title := 'PROGRAMMER'; (* ( (title <> 'PROGRAMMER) AND *) r.ssn := 315687890; (* (ssn = 316700056) AND *) r.name := 'Pamela*'; (* (name LIKE 'Pamela%') AND *) r.name_op := '=='; (* 大文字小文字を区別する検索の実行 *) r.age := 30; (* ((age >= 13) AND (age <= 49)) AND *) r.age_lo := 13; r.age_hi := 49; r.age_op := '='; r.MARRIED_OP := 'is NOT null'; (* (married IS NOT NULL) AND *) r.rating := 43.457; (* (rating = 43.457) *) r.addr := '5051 ?. Morris *'; (* (addr NOT LIKE '5050 _. Morris %') AND *) r.bTime := {14,09,16}:TIME; (* (bTime = '14:09:16') AND *) r.bDate := {06,26,1985}:DATE; (* (bDate= '06/26/1985') AND *) r.sysDT := '1961-10-10-14.09.16.00'; (* (sysDT >= '1961-10-10-14.09.16.00)) *) r.sysDT_op := '>=';
SQLCreateSearchString('emps',searchString,r);
ret := SQLSelect(cursor, 'emps',searchString); IF ret < 0 THEN Exit ret; END;
ret := SQLFetch(cursor,r); WHILE ret > 0 DO
(* r... の処理 *)
ret := SQLFetch(cursor); END;
SQLCloseCursor(cursor); END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
指定された行をテーブルから削除します。
SQLDelete(tableName: STRING, queryString: STRING [,expressionList...]): INTEGER;
注意: SQLDelete を 1 回呼び出せば多数の行を削除できるので、WHERE 文節を慎重に指定することが重要です
引き数名 | 説明 |
tableName | 行を削除するテーブルの名前。 |
queryString | WHERE 文節。 |
expressionList | これは、コンマで区切られるゼロ個以上の式のリストです。例: 3.4, age + 100, name, 'Fred', Sin(45), ... |
照会ストリング内の WHERE キーワードは任意選択です。
SQLDelete は、パラメーター・マーカー置換を考慮しています。パラメーター・マーカー を使用するには、ステートメント・ストリングに疑問符 (?) を挿入します。これは、後で置換される値の プレースホルダーとして役に立ちます。
この値は、ステートメント・ストリングの後に続く式リスト (任意選択) から 来ます。 式の数はパラメーター・マーカー (?) の数と一致していなければならず、式の順序は それらのマーカーの順序と一致していなければなりません。
Tivoli Service Desk Developer's Toolkit は、パラメーター・マーカーを使った堅固なタイプ検査 を提供することはできません。例:
retCd = SQLDelete('emp','WHERE name = ?',name);
変数名に含まれているストリングを単一引用符で囲む必要はありません。変数を使用する 必要はありません。 例:
retCd = SQLDelete('emp','WHERE name = ?','Smith');
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF AGE: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF AGE: INTEGER):INTEGER IS VARIABLES retCd : INTEGER; ACTIONS (* この関数に渡された年齢より大きい年齢を持つすべての従業員を *) (* Indiana から削除。*) retCd := SQLDelete('emp','(state = ''IN'') AND (age >> ' & age & ')'); IF (retCd < 0) THEN EXIT retCd; END;
END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
現行カーソル位置にある行を削除します。
SQLDeleteCurrent(cursor: SQLCURSOR): INTEGER;
引き数名 | 説明 |
cursor | cursor は、SQLSelect を呼び出して前もってオープンしておかなければなりません |
SQLDeleteCurrent は DB2 CLI ドライバーの場合にしかサポートされません。
更新ではありませんが、行を削除する時には、SQLSelect の中で FOR UPDATE OF 文節を 使用してください。そうすると、SQL インタープリターは正しくロックを適用します。FOR UPDATE OF 文節が指定されていないと、選択は読み取り専用とみなされます。
FOR UPDATE OF 文節に各更新済み列を指定しなければならない SQLUpdateCurrent とは 違って、SQLDeleteCurrent を使用する時には列を 1 つだけ指定すれば十分です。 有効な列を少なくとも 1 つ指定する必要があり、* は使用できません。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS
VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; retCd : INTEGER; ACTIONS SQLBeginWork
(* この関数に渡された年齢より大きい年齢を持つすべての従業員を *) (* Indiana から選択。*) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME');
IF (retCd < 0) THEN SQLRollBack; (* このトランザクションを終了 *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* もしかすると、"name" に基づいていくつかの操作を実行 *)
(* この行をただちに削除 *) retCd := SQLDeleteCurrent(cursor); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* どの変更も取り消して、ロックを解除 *) EXIT retCd; END;
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* 変更を受け入れてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
準備されたステートメントを実行します。
SQLExecute(statement: STATEMENT [,expressionList...]): INTEGER;
ロールバック操作は、オープンしている (準備された) すべてのステートメントおよびカーソルを自動的に クローズします (SQLRollBack を参照)。コミット操作は、オープンしているステートメントのうち、 オープンしているカーソルを参照していないものをすべて自動的にクローズします。
注: オープンしている ステートメントはいつでも 20 個に制限されます
引き数名 | 説明 |
statement | これは、SQLPrepare から取得される、準備済み形式のステートメントです。 |
expressionList | これは、コンマで区切られるゼロ個以上の式のリストです。例: 3.4, age + 100, name, 'Fred', $Sin(45), ... |
コマンドをループ内で何回も実行する場合には、SQLPrepare を使用して、いったんそのコマンド を準備し、その上で SQLExecute を使用して準備済みバージョンをループ内で実行した方が、 早くなる可能性があります。
SQLExecute は、パラメーター・マーカー置換を考慮しています。パラメーター・マーカー を使用するには、ステートメント・ストリングに疑問符 (?) を挿入します。
これは、後で置換される値の プレースホルダーとして役に立ちます。 この値は、ステートメント・ストリングの後に続く式リスト (任意選択) から 来ます。 式の数はパラメーター・マーカー (?) の数と一致していなければならず、式の順序は それらのマーカーの順序と一致していなければなりません。
Tivoli Service Desk Developer's Toolkit は、パラメーター・マーカーを使った堅固なタイプ検査 を提供することはできません。例:
retCd = SQLPrepare(stmt, 'UPDATE emp SET name= ? WHERE ssn=?);
変数名に含まれているストリングを単一引用符で囲む必要はありません。変数を使用する 必要はありません。 例:
retCd = SQLExecute (stmt, 'Smith', 317689630);
パラメーター・マーカーを使えば、SQLUpdate や SQLExecuteImmediate などの 代わりに、効率のよい SQLPrepare/SQLExecute 組み合わせを用いて、密なループ内で ある種の操作 (この更新など) を実行することができます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd : INTEGER; ACTIONS SQLBeginWork; (* トランザクションの開始 *)
(* 渡されたユーザー名を挿入 *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* このトランザクションを終了 *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF (retCd < 0) THEN SQLRollBack; (* 変更を取り消してロックを解除 *) EXIT retCd; END; END; (* for *)
SQLCloseStatement(stmt); SQLCommit; (* 変更を受け入れてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
SQL ステートメントをそのストリング形式から直接に実行します。
SQLExecuteImmediate(sqlCommand: STRING [,expressionList...]): INTEGER;
引き数名 | 説明 |
sqlCommand | これは、完全な、構文的に正しい SQL コマンド (ステートメント) で、動的に準備可能な、SELECT コマンド以外のものでなければなりません。 |
expressionList | これは、コンマで区切られるゼロ個以上の式のリストです。例: 3.4, age + 100, name, 'Fred', $Sin(45), ... |
SQLExecuteImmediate を使えば、SELECT コマンドと動的に準備できないコマンドを除く、 ほとんどどの SQL コマンドでも実行することができます。
コマンドをループ内で何回も実行する場合には、いったんそのコマンドを準備し、その上で 準備済みバージョンをループ内で実行した方が、早くなる可能性があります。
コマンド・ストリングの作成を容易にするために、Tivoli Service Desk Developer's Toolkit の 組み込みストリング操作関数を使用する場合があります。
Tivoli Service Desk Developer's Toolkit は SQLExecuteImmediate で修飾拡張を行いません。 それでも $QUAL と $SYSQUAL を使用することができます。
注: SQLExecuteImmediate はパラメーター・マーカー置換を考慮しています
パラメーター・マーカー を使用するには、ステートメント・ストリングに疑問符 (?) を挿入します。 これは、後で置換される値の プレースホルダーとして役に立ちます。 この値は、ステートメント・ストリングの後に続く式リスト (任意選択) から 来ます。 式の数はパラメーター・マーカー (?) の数と一致していなければならず、式の順序は それらのマーカーの順序と一致していなければなりません。
Tivoli Service Desk Developer's Toolkit は、パラメーター・マーカーを使った堅固なタイプ検査 を提供することはできません。例:
retCd = SQLExecuteImmediate('UPDATE emp SET name = ? WHERE ssn = ?',name,ssn);
変数名に含まれているストリングを単一引用符で囲む必要はありません。変数を使用する 必要はありません。 例:
retCd =SQLExecuteImmediate('UPDATE emp SET name = ? WHERE ssn?','Smith', 316798965);
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* emp のテーブル列 *) sDate: DATE; (* 'integer' *) name: STRING; (* 'char(15)' *) age: INTEGER; (* 'smallint' *) ssn: INTEGER; (* 'integer' *) married: BOOLEAN; (* 'smallint' *) salary: REAL; (* 'float' *) rating: REAL; (* 'decimal(8,3)' *) addr: STRING; (* 'varchar(81)' *) sp: SPACE; (* 'varchar(2500) *) lsp: SPACE; (* 'ビット・データの long varchar *) bDate: DATE; (* 'date' *) bTime: TIME; (* 'time' *) sTime: TIME; (* 'integer' *) sysDT: STRING; (* 'timestamp' *)
(* 各種 *) retCd : INTEGER; s: STRING;
ACTIONS
SQLExecuteImmediate('DROP TABLE tsql');
s := 'CREATE TABLE tsql (name CHAR(15), ' & 'age SMALLINT, ' & 'married SMALLINT, ' & 'ssn INTEGER, ' & 'salary FLOAT, ' & 'rating DECIMAL(8,3), ' & 'addr VARCHAR(81), ' & 'sp VARCHAR(2500), ' & 'lsp LONG VARCHAR FOR BIT DATA, ' & 'bdate DATE, ' & 'btime TIME, ' & 'sdate INTEGER, ' & 'stime INTEGER, ' & 'sysDT TIMESTAMP) ' & 'PRIMARY KEY(ssn))'; retCd := SQLExecuteImmediate(s);
EXIT retCd; END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
その他の情報については SQL の資料を参照してください。
カーソルの次の行を取り出して、指定されたパラメーターに入れます。
SQLFetch(cursor: SQLCURSOR [,parameterList...]): INTEGER;
注意: 事前初期設定取り出し最適化 を使用する場合には、最初の (初期化する) 取り出しにリストされたパラメーター (列変数) が、 後続の (初期化される) 取り出しが実行される時にまだ可視であるようにしてください。初期化する取り出し、 パラメーター、および初期化される取り出しがすべて同じ関数内にある時には、これが常に当てはまります。
注: ロールバックは すべてのカーソルをクローズします。 取り出しループの途中でロールバックが起こると、SQLFetch に 対する次の呼び出しは失敗します。
引き数名 | 説明 |
cursor | cursor は、SQLSelect を呼び出して前もってオープンしておかなければなりません。 |
parameters | これは、ゼロ個以上のパラメーター (列変数) をコンマで区切ったリストで、 各パラメーターの名前は対応する列名と一致していなければなりません (このステートメントの「注」を参照)。 |
SQLFetch には、最適化のために 2 つの形式があります。第 1 の形式は、カーソルの後に すべてのパラメーター (列変数) がリストされるもので、第 2 の形式は、カーソルだけがあるもの です。第 1 の形式は、パラメーターへの迅速挿入を考慮するように Tivoli Service Desk Developer's Toolkit を 初期化するので、初期化する 取り出しと呼ばれます。第 2 の形式では、取り出される パラメーターが第 1 の形式の取り出しに対する最新の呼び出しに指定されたパラメーターと同じである とみなされます。第 2 の形式は初期化される 取り出しまたは事前初期設定 取り出しと呼ばれます。
Tivoli Service Desk Developer's Toolkit が取り出しパラメーターに気付くと、それらのパラメーターを 再び指定しなければ、Tivoli Service Desk Developer's Toolkit ははるかに早くなります。(このため、 Tivoli Service Desk Developer's Toolkit は必要以上にパラメーターを再初期化します。)
注: 事前初期設定取り出し の使用の詳細については、このステートメントの「注意」を参照してください
パラメーター名はそれぞれの列名と一致していなければなりません。列名と一致しない名前を持つ
パラメーターはいずれも無視されます。列名が SQLColumn_ で始まっていて、選択リスト内のその位置
に対応する列番号で終わっている場合には、例外が発生します。この方法を使えば、列 (総計) 関数の
結果にアクセスすることができます。
たとえば、選択ストリングが
SELECT count(*) FROM emp
で、SQLColumn_1 をタイプ INTEGER の変数として宣言した場合には、次のものを使ってカウントを取り出すことができます。
SQLFetch(cursor,$SQLColumn_1);
$SQLColumn_xx パラメーターの順序は、パラメーター・リスト内では重要ではありません。
たとえば、name が文字列で、age が数字列で、 選択ストリングが
SELECT name,age FROM emp
である時に、$SQLColumn_xx 変数を
$SQLColumn_1: STRING; $SQLColumn_2: INTEGER;
と宣言した場合には、次の取り出しでは name は $SQLColumn_1 に入り、 age は $SQLColumn_2 に入ります。
SQLFetch(cursor,$SQLColumn_1,$SQLColumn_2);
また同様に次のようにもなります。
SQLFetch(cursor,$SQLColumn_2,$SQLColumn_1);
この例では STRING と INTEGER を使用していますが、$SQLColumn に
対しては、LIST と WINDOWS 以外の任意の有効な TSD Script データ・タイプを定義することができます。
レコードをパラメーターとして渡す場合があります。この場合には、フィールド名 がテーブルの列名と一致していなければなりません。そうでないと、フィールド名は無視されます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; retCd : INTEGER; ACTIONS SQLBeginWork; (* トランザクションの開始 *)
(* この関数に渡された年齢より大きい年齢を持つすべての 従業員を *) (* Indiana から選択。*) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* トランザクションを終了 *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* もしかすると、"name" に基づいていくつかの操作を実行
. . . *)
(* name を大文字に設定 *) name := StrUpper(name);
(* この行をただちに更新 *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* どの変更も取り消して、ロックを解除 *) EXIT retCd; END;
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* 変更を受け入れてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
データ値を、現在接続されている DBMS にふさわしいデータ形式のストリングに変換します。
SQLFormat(value: SIMPLE EXPRESSION): STRING;
DBMS が必要とする日付および時刻形式は、表示に使用される日付および時刻形式とは 異なる場合があります。たとえば、デフォルトの Oracle 日付形式は DD-MON-YY ですが、 米国のワークステーションにおけるデフォルトの Tivoli Service Desk Developer's Toolkit 日付形式 は MM/DD/YYYY です。
引き数名 | 説明 |
value | これは単純タイプ (DATE や STRING など) でなければなりません |
SQLFormat が戻すのは、戻りコードではなく、操作が成功したかどうかを示す書式制御ストリング です。渡された値が $Unknown の場合には、ストリング 'NULL'が戻されます。 文字列の特定の形式設定は、その文字列のタイプによって異なります。
書式制御ストリングが戻されます。渡された値が $Unknown の場合には、ストリング 'NULL'が戻されます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES FUNCTION GetCount(VAL d: DATE): INTEGER;
PRIVATE ROUTINES FUNCTION GetCount(VAL d: DATE): INTEGER IS VARIABLES retCd : INTEGER; cmd : STRING; $SQLColumn_1 : INTEGER; ACTIONS cmd := 'SELECT COUNT(*) FROM COMPANIES WHERE name = ' & SQLFormat('Joe''s place') & ' AND founded_date ' & SQLFormat(d); retCd := SQLSelectInto(cmd, $SQLColumn_1); IF retCd < 0 THEN Exit( retCd ); ELSE Exit( $SQLColumn_1 ); END; END;
日付および時刻形式、ならびに整数および実数形式の詳細については、 第 3 章の "データ・タイプ形式フラグ" を参照してください。
sai_sql.cfg ファイルの詳細については、Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照してください。
SQL インタープリターが内部的に使用する、指定されたカーソルの実際のカーソル名を取得します。
SQLGetCursorName(cursor: SQLCURSOR, cursorName: STRING):
INTEGER;
引き数名 | 説明 |
cursor | cursor は、SQLSelect を呼び出して前もってオープンしておかなければなりません |
cursorName | カーソルの名前 |
SQLGetCursorName は DB2 CLI ドライバーの場合にしかサポートされません。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; cursorName: STRING; retCd : INTEGER; ACTIONS (* この関数に渡された年齢より大きい年齢を持つすべての 従業員を *) (* Indiana から選択。*) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN EXIT retCd; END;
SQLGetCursorName(cursor,cursorName);
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO
(* もしかすると、"name" および "cursorName" に基づいていくつかの操作を実行 . . . *)
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END; SQLCloseCursor(cursor); END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
構成またはコンテキスト状態オプションの値を検索します。
SQLGetOption(VAL option: STRING, REF optionValue : <ANY SIMPLE VARIABLE> [, VAL srcOrConn : <INTEGER OR STRING EXPRESSION>]) : INTEGER;
注意: SQL 構成ファイル (sai_sql.cfg) の オプションとは違って、SQLGetOption に渡されるオプション名は、区切り記号として下線ではなく スペースを使用します
注: SQLGetOption を使って取得できるオプションの大部分は、SQLSetOption を使って設定することができます。
引き数名 | 説明 |
option | オプションの名前 (例: 'DATE FORMAT')。完全にリストについては「注」セクションを参照してください。 |
optionValue | オプションの値に設定される変数; |
srcOrConn | この引き数は任意選択です。指定する場合には、ソース名 (STRING) か接続ハンドル (INTEGER) のいずれかを入れなければなりません。この引き数が渡されないと、$CURRENT が仮定されます。 |
この関数は成功またはエラー・コードを戻します。最も多いエラー・コードは次のものです: INVALID_OPTION および NOT_CONNECTED (接続が必要なオプションの場合、これはほとんどのオプション に当てはまります)。
この関数は、STRING データを戻すことができるという利点を使って、前の機能性 を SQLCommand ('GET ... '); に組み込みます。
以下に示すのは、このコマンドと一緒に指定できるオプションです。
オプション | 説明 |
'BIND PARAMETER BUFFER SIZE' | パラメーターのバインドに使用されるバッファー・サイズを戻します。 |
'BIND PARAMETER FILL OUTPUT NULL VALS' | NULL である出力値がゼロに設定された場合に TRUE を戻します。 |
'BIND PARAMETER PAD OUTPUT STRINGS' | 出力パラメーター・ストリングが指定された精度までブランクが埋め込まれた場合に TRUE を戻します。 |
'BOOLEAN FORMAT' | ブール値を DBMS に保管するために使用される形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'BOOLEAN PARAMETER PRECISION' | ブール値のバインドに使用される精度を戻します。 |
'BOOLEAN PARAMETER TYPE' | ブール値のバインドに使用される X/Open データ・タイプを戻します。 |
'BOOLEAN STORAGE TYPE' | ブール値を表すために使用される保管タイプを戻します。使用可能な値は次の通りです。
1 - INTEGER 2 - STRING 3 - BOOLEAN |
'CASE CONVERSION' | オブジェクト名に対して Tivoli Service Desk Developer's
Toolkit が使用する大文字小文字変換を戻します (データには適用されません)。使用可能な値は次の通りです。 1 - 大文字 2 - 小文字 3 - なし |
'CASE SENSITIVITY' | データベースが大文字小文字を区別するオブジェクト名を持っている場合に TRUE を戻します (データの大文字小文字の区別には適用されません)。 |
'CATALOG CASE CONVERSION' | カタログ・ビュー (SAI_SYSCOLUMNS および SAI_SYSTABLES) 内のデータに対して Tivoli Service Desk Developer's Toolkit が使用する大文字小文字変換を戻します。使用可能な値は次の通りです。 1 - 大文字 2 - 小文字 3 - なし |
'CHECK DRIVER' | Tivoli Service Desk Developer's Toolkit が、当該ドライバーがサポートされないものとしてリストされているかどうかを調べる検査を行う場合に、TRUE を戻します。 |
'COLUMN CATALOG METHOD' | 列カタログ値を取得するために Tivoli Service Desk
Developer's Toolkit が使用する方法を戻します。使用可能な値は次の通りです。 1 - 標準方式を使用して列カタログを 照会します。 2 - 列カタログに対して DBMS 固有の照会を 使用します。 3 - ODBC SQLColumn() 関数を使用します。 |
'COMMIT SELECTS' | 手動コミットが TRUE の場合に適用されます。読み取り専用作業単位の後でコミットが実行されるかどうかを戻します。 |
'CONFIG FILE' | 接続時に Tivoli Service Desk Developer's Toolkit が使用する構成ファイルの名前を戻します。この値を取得するために接続する必要はありません。 |
'CONNECTION' | 接続ハンドルを戻します。SQLGetOption を使ってこのオプションを取得できますが、 SQLSetOption を使ってこのオプションを設定することはできません。 |
'CURRENT COL BUFFER' | 現行の列バッファーのサイズを戻します。 |
'CURRENT ROW BUFFER' | 現行の行バッファーのサイズを戻します。 |
'DATE FORMAT' | DBMS の日付形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'DATE PARAMETER PRECISION' | 日付値のバインドに使用される精度を戻します。 |
'DATE PARAMETER TYPE' | 日付値のバインドに使用される X/Open データ・タイプを戻します。 |
'DATE STORAGE TYPE' | 日付を表すために使用される保管タイプを戻します。使用可能な値は次の通りです。 1 - INTEGER 2 - STRING 6 - DATE |
'DBMS' | DBMS (番号) を戻します。現在認識されている DBMS は次のとおりです: 0 - DB2/2、DB2/6000、DB2/NT、DB2/UX 1 - ORACLE 2 - DB2 3 - SQL SERVER 4.x 4 - SYBASE 5 - NETWARE SQL 6 - GUPTAN SQLBASE 7 - XDB 8 - DBASE 9 - BTRIEVE 10 - ASCII TEXT 11 - EXCEL 12 - SYBASE 10 (およびそれ以上) 13 - PARADOX 14 - INGRES3 15 - INGRES4 16 - INFORMIX4 17 - INFORMIX5 18 - TANDEM 19 - PROGRESS 20 - HP ALLBASE 21 - WATCOM 22 - FULCRUM 23 - MS SQL SERVER 6.x 24 - (その他) |
'DBMS STRING' | 次のデータベース名を戻します: DB2、ORACLE、SQLSERVER、SYBASE、または DBMS_OTHER。 |
'DSN' | 現行の ODBC データ・ソース名を戻します (ODBC データ・ソースに接続されている場合のみ)。 |
'HAS TRANSACTIONS' | DBMS がトランザクションをサポートしている場合に TRUE を戻します |
'IN TRANSACTION' | SQLBeginWork で開始されたトランザクションがコミットまたはロールバックされていない場合に、TRUE を戻します。このオプションは、SQLGetOption を使って取得できますが、SQLSetOption を使って設定することはできません。 |
'INTEGER FORMAT' | DBMS の整数形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'INTEGER PARAMETER PRECISION' | 整数値のバインドに使用される精度を戻します。 |
'INTEGER PARAMETER TYPE' | 整数値のバインドに使用される X/Open データ・タイプを戻します。 |
'INTEGER STORAGE TYPE' | 整数を表すために使用される保管タイプを戻します。使用可能な値は次の通りです。
1 - INTEGER 2 - STRING |
'LAST ERROR MSG' | 最後の DBMS エラー・メッセージを戻します。 |
'MANUAL COMMITS' | SAI_SQL (ドライバーでなく) がコミット動作をコントロールする場合に TRUE を戻します。 |
'MAX LITERAL LEN' | Tivoli Service Desk Developer's Toolkit が挿入および更新時にパラメーターのバインドを行うストリング・リテラルの最大長の値を戻します。 |
'MODULE' | 後方互換性の場合のみ。モジュール・タイプを戻します。Tivoli Service Desk Developer's Toolkit 5.0 に可能な値は 5 (X/Open) だけです。 |
'MODULE TYPE' | 後方互換性の場合のみ。モジュール・タイプを戻します。Tivoli Service Desk Developer's Toolkit 5.0 に可能な値は 5 (X/Open) だけです。 |
'MULTI CONNECT' | DBMS がクライアント・プロセスからの複数の接続をサポートしている場合に TRUE を戻します。 |
'MULTI CONNECT REQUIRED' | DBMS が複数の同時 ("ネストされた") SQL ステートメントにかなうように複数の接続を必要とする場合に、TRUE を戻します。 |
'NEEDS CODEPAGE TRANSLATION' | Tivoli Service Desk Developer's Toolkit が ANSI から OEM および OEM から ANSI へのコード・ページ変換を行う場合に TRUE を戻します (Windows のみ)。 |
'PROCESS RESULTS ON FREESTMT' | Tivoli Service Desk Developer's Toolkit が、もはや行が戻されなくなるまで取り出しによって完全な結果セットのフラッシュを保証する場合に、TRUE を戻します。 |
'QUAL' | データ・テーブルへのアクセスに使用される修飾子 (通常は作成者か所有者) を戻します。 |
'REAL FORMAT' | DBMS の実数形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'REAL PARAMETER PRECISION' | 実数値のバインドに使用される精度を戻します。 |
'REAL PARAMETER SCALE' | 実数値のバインドに使用されるスケールを戻します。 |
'REAL PARAMETER TYPE' | 実数値のバインドに使用される X/Open データ・タイプを戻します。 |
'REAL STORAGE TYPE' | 実数を表すために使用される保管タイプを戻します。使用可能な値は次の通りです。 2 - STRING 3 - REAL |
'SHOW WARNINGS' | 警告メッセージ・ボックスが表示される場合に TRUE を戻します。 |
'SOURCE' | 現在接続されている SAI_SQL データ・ソースの名前を戻します。 |
'STRING FORMAT' | DBMS のストリング形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'STRING PARAMETER PRECISION' | ストリング値のバインドに使用される精度を戻します。 |
'STRING PARAMETER TYPE' | ストリング値のバインドに使用される X/Open データ・タイプを戻します。 |
'SYSQUAL' | システム・カタログ・テーブルへのアクセスに必要な修飾子を戻します。 注: Tivoli Service Desk Developer's Toolkit バージョン 4.1.0 以上では、カタログ情報に対して SAI 作成のラッパー・ビューを使用するので、通常のシステム修飾子 (たとえば SYSIBM など) ではなくビュー (たとえば EXAV など) を作成するために SYSQUAL が使用されます。 |
'TABLE CATALOG METHOD' | テーブル・カタログ値を取得するために Tivoli Service Desk
Developer's Toolkit が使用する方法を戻します。使用可能な値は次の通りです。 1 - 標準方式を使用して列カタログを 照会します。 2 - 列カタログに対して DBMS 固有の照会を 使用します。 3 - ODBC SQLTable() 関数を使用します。 |
'TIME FORMAT' | DBMS の時刻形式を戻します。データ形式設定の詳細については、本書の第 3 章を参照してください。 |
'TIME PARAMETER PRECISION' | 時刻値のバインドに使用される精度を戻します。 |
'TIME PARAMETER TYPE' | 時刻値のバインドに使用される X/Open データ・タイプを戻します。 |
'TIME STORAGE TYPE' | 時刻を表すために使用される保管タイプを戻します。使用可能な値は次の通りです。 1 - INTEGER 2 - STRING 5 - TIME |
'TRACE ALERT DESTINATION' | アラート・ファイルのファイル名を戻します (アラートが使用されている場合)。 |
'TRACE APPEND' | トレース・ファイルがその度ごとに (上書きではなく) 付加される場合に TRUE を戻します。 |
'TRACE AUTO FLUSH' | どの書き込みの後でもトレース出力がトレース・ファイルにフラッシュされる場合に TRUE を戻します。 |
'TRACE ENABLED' | トレースが使用可能になっている場合に TRUE を戻します。 |
'TRACE FILE' | トレース出力ファイルの名前を戻します。 |
'TRACE INDENT INCR' | 使用されている字下げ増分を戻します。 |
'TRACE MAX LINE LENGTH' | 折り返しが起こる行の最大長を戻します。 |
'TRACE NUM EXECUTES' | loggedSQLFetch および SQLExecute ステートメントの最大数を戻します。 |
'TRACE PARAM SIZE' | ファイルに書き込まれるパラメーターの最大長を戻します。 |
'TRACE SEPARATOR' | 使用されているトレース出力区切り記号を戻します。 |
'TRACE STATEMENT SIZE' | ファイルに書き込まれるステートメントの最大長を戻します。 |
'TRACE STATEMENTS' | 現在トレースされているステートメントのビット・マスクを戻します。 |
'TRANSLATE FUNC' | DBMS の大文字関数の名前を戻します。 |
'UPDATE LOCK COLUMN' | 受動並行性ロックに使用される列 (名) を戻します (通常は MODIFY_DATETIME)。 |
'UPDATE LOCK ERROR FILTER' | 受動並行性更新ロックが行われている間に使用されるエラー・フィルター・レベルを戻します。使用可能な値は次の通りです。 0 - 致命的 (デフォルト) 1 - エラー 2 - 警告 3 - 通知 |
'UPDATE LOCK STYLE' | 受動並行性更新に使用されるロック・スタイルを戻します。使用可能な値は次の通りです。 1 - 更新のための選択 2 - 更新 3 - 条件付き更新 |
'UPDATE MODE' | 受動並行性更新モード (アルゴリズム) を戻します。使用可能な値は次の通りです。 1 - 選択 2 - DBMS 最適 3 - なし |
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES PROCEDURE Example; PRIVATE ROUTINES PROCEDURE Example IS VARIABLES retCd : INTEGER; dateFormat : INTEGER; lastErrorMsg : STRING; hConn : INTEGER; ACTIONS retCd := SQLGetOption('LAST ERROR MSG' lastErrorMsg); retCd := SQLGetOption('DATE FORMAT', dateFormat, 'ADVISOR'); retCd := SQLGetOption('CONNECTION', hConn); retCd := SQLGetOption('DATE FORMAT', dateFormat, hConn); END;
指定されたテーブルに新しい行を挿入します。
SQLInsert(tableName: STRING [,parameters...]): INTEGER;
引き数名 | 説明 |
tableName | 行を挿入するテーブルの名前。 |
parameters | これは、ゼロ個以上のパラメーター (列変数) をコンマで区切ったリストで、各パラメーターの名前は対応する列名と一致していなければなりません (詳しくはこのステートメントの「注」を参照)。 |
SQLInsert に渡されるパラメーター (列変数) は、テーブルの実際の列と同じ名前を 持っていなければなりません。どの列名とも一致しないパラメーター名があると、そのパラメーターは無視されます。
注: テーブルの すべての列についてではなく、NOT NULL として作成された列についてだけパラメーターを渡す 必要があります
値が $Unknown である Tivoli Service Desk Developer's Toolkit パラメーターを、 対応する列が NOT NULL オプションで作成されたテーブルに挿入しないようにしてください。レコード をパラメーターとして渡すことができます。この場合には、フィールド名がテーブルの列名と 一致していなければなりません。そうでないと、フィールド名は無視されます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* 列名 *) name: STRING; ssn: INTEGER; (* 各種 *) retCd : INTEGER; ACTIONS (* 列値を設定 *) name := 'Fred'; ssn := 316768990;
(* 新しい行を挿入 *) retCd := SQLInsert('emp',name,ssn); IF (retCd < 0) THEN EXIT retCd; END;
END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
SQLPrepare は、後からの実行に備えて SQL コマンド・ストリングを準備します。この コマンド・ストリングは、いったん準備されると、準備済みステートメントと呼ばれます。SQLPrepare 操作 が成功すると、ステートメント・パラメーターとして渡す変数に、有効なステートメント・ハンドルが入れられます。
SQLPrepare(statement: SQLSTATEMENT, sqlCommand: STRING): INTEGER;
ロールバック操作は、オープンしている (準備された) すべてのステートメントおよびカーソルを自動的に クローズします。コミット操作は、オープンしているステートメントのうち、WITH HOLD であると宣言された オープン・カーソルを参照していないものをすべて自動的にクローズします (SQLCommit を参照)。
引き数名 | 説明 |
statement | 後続の SQLExecute ステートメントで使用されるステートメント・ハンドル |
sqlCommand | これは、完全な構文的に正しい SQL ステートメントです |
SQLPrepare を使えば、SELECT コマンドと動的に準備できないコマンドを除く、 ほとんどどの SQL コマンドでも準備することができます。
コマンド (SQLDelete など) をループ内で何回も実行する場合には、いったんそのコマンド を準備した上で、SQLExecute を使ってその準備済みバージョンを実行した方が、そのコマンドを その度ごとに直接実行するよりも早くなります。
注: Tivoli Service Desk Developer's Toolkit の組み込みストリング操作関数を使用すれば、準備するコマンド・ストリングの作成が 容易になります
Tivoli Service Desk Developer's Toolkit は SQLPrepare で修飾拡張を行いません。 ただし、それでも $QUAL と $SYSQUAL を使用することができます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd : INTEGER; ACTIONS SQLBeginWork; (* トランザクションの開始 *)
(* 渡されたユーザー名を挿入 *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* トランザクションを終了 *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF (retCd < 0) THEN SQLRollBack; (* 変更を取り消してロックを解除 *) EXIT retCd; END; END; (* for *)
SQLCloseStatement(stmt); SQLCommit; (* 変更を受け入れてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
その他の情報については、SQL の資料を参照してください。
ROLLBACK WORK コマンドを SQL インタープリターに出し、その結果として、 このトランザクション中に行われたすべての変更の取り消し / やり直しを行います。
FUNCTION SQLRollBack: INTEGER;
注意: ロールバック により、すべてのオープン・カーソルおよび準備済みステートメントが自動的にクローズされます
SQLRollBack は現行トランザクションを終了します。別のトランザクションを開始したい 場合には、改めて SQLBeginWork を呼び出す必要があります。そうしないと、TSD Script は各 SQL ステートメントの自動コミットを再開します。
失敗したトランザクションがユーザー入力とは無関係な小さいものである場合には、 それを取り消すのに SQLRollBack を使用します。ロールバックをユーザー・インターフェース操作 に対する総称やり直しとして使用しないようにしてください。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF ssnList: LIST OF INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF ssnList: LIST OF INTEGER):INTEGER IS VARIABLES (* 各種 *) retCd : INTEGER; ACTIONS (* 論理トランザクションの開始 *) SQLBeginWork; (* 渡された ssn リストにその ssn が入っているすべての従業員を削除 *)
FOR ssnList DO retCd := SQLDelete('emp','ssn = ' & ssnList[$CURRENT]); IF retCd < 0 THEN SQLRollBack; (* 変更を取り消してロックを解除 *) EXIT retCd; END; END;
(* 変更をコミットしてロックを解除 *) SQLCommit; END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
後から SQLFetch によって取り出すために指定された行に基づいてカーソルをオープンします。
SQLSelect(cursor: SQLCURSOR, queryString: STRING [,expressionList...]): INTEGER;
オープンしているカーソルはいつでも 20 個に制限されます。
ロールバック操作は、すべてのカーソルを自動的にクローズします。
ほとんどのドライバーでは、複数の作業単位にまたがる可能性のあるカーソルを指定することは できません (すなわち、WITH HOLD であると宣言するなど)。例外は DB2 CLI ドライバーです。コミット操作 後に、すべてのカーソルがクローズされます。したがって、取り出しループ内で SQL 操作 (更新など) を 実行する場合には、どの SQL ステートメントの後でも自動コミットを使用不可にする必要があります。
注: コミット またはロールバック操作を実行する前に、すべてのカーソルをクローズしてください
引き数名 | 説明 |
cursor | 照会のカーソル・ハンドル。 |
queryString | これは選択ストリングです。完全で、構文的に正しいものでなければなりません。 |
expressionList... | これは、コンマで区切られるゼロ個以上の式のリストです。例: 3.4, age + 100, name, 'Fred', $Sin(45), ... |
取り出した行を更新または削除する場合には、FOR UPDATE OF 文節を使い、SQL インタープリター に対してユーザーの意図を明らかにしてください。これは、後から SQLUpdateCurrent を 行いたい場合に必要です。
これはまた、SQLDeleteCurrent を使用する場合にもよい方法です。FOR UPDATE OF 文節を使用しないと、 選択は読み取り専用とみなされます。
注: 単純選択ストリング (例のような) の場合には、SELECT キーワードは任意選択です
SQLSelect はパラメーター・マーカー置換を考慮しています。パラメーター・マーカー を使用するには、ステートメント・ストリングに疑問符 (?) を挿入します。これは、後で置換される値の プレースホルダーとして役に立ちます。この値は、ステートメント・ストリングの後に続く式リスト (任意選択) から 来ます。式の数はパラメーター・マーカー (?) の数と一致していなければならず、式の順序は それらのマーカーの順序と一致していなければなりません。
Tivoli Service Desk Developer's Toolkit は、パラメーター・マーカーを使った堅固なタイプ検査 を提供することはできません。例:
retCd = SQLSelect(cursor,'SELECT * FROM emp WHERE name = ?',name);
変数名に含まれているストリングには単一引用符を使用する必要はありません。変数を使用する 必要はありません。例:
retCd = SQLSelect(cursor,'SELECT * FROM emp WHERE name = ?', 'Smith');
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; retCd : INTEGER; ACTIONS SQLBeginTran; (* トランザクションの開始 *)
(* この関数に渡された年齢より大きい年齢を持つすべての *) (* 従業員を Indiana から選択。*) retCd := SQLSelect(cursor,'SELECT name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* トランザクションを終了 *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* もしかすると、"name" に基づいていくつかの操作を実行 . . . *)
(* name を大文字に設定 *) name := StrUpper(name);
(* この行をただちに更新 *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollBack; (* 変更を取り消してロックを解除 *) EXIT retCd; END;
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* 変更を受け入れてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
指定された行を選択して取り出し、パラメーター (列変数) に入れます。
SQLSelectInto(queryString: STRING [,parameters...]): INTEGER;
引き数名 | 説明 |
queryString | これは選択ストリングです。完全で、構文的に正しいものでなければなりません。 |
parameters | これは、ゼロ個以上のパラメーター (列変数) をコンマで区切ったリストで、各パラメーターの名前は対応する列名と一致していなければなりません。 その他の情報については、「注」セクションを参照してください。 |
SQLSelectInto は次のコード列と等価です。
SQLSelect SQLFetch SQLCloseCursor
したがって、選択照会が複数の行を指定していても、取り出されるのは最初の行だけです。
取り出した行を更新または削除する場合には、FOR UPDATE OF 文節を使い、SQL インタープリター に対してユーザーの意図を明らかにしてください。FOR UPDATE OF 文節を使用しないと、 選択は読み取り専用とみなされます。
パラメーター名はそれぞれの列名と一致していなければなりません。列名と一致しない名前を持つ パラメーターはいずれも無視されます。列名が SQLColumn_ で始まっていて、選択リスト内のその位置 に対応する列番号で終わっている場合には、例外が発生します。この方法を使えば、列 (総計) 関数の 結果にアクセスすることができます。
たとえば、SQLColumn_1 を変数 (整数) として宣言した場合には、次のものを使ってカウントを 取り出すことができます。
SQLSelectInto('SELECT count(*) from emp',$SQLColumn_1);
$SQLColumn_xx パラメーターの順序は、パラメーター・リスト内では重要ではありません。 For example, if name is a character column, and age is a numeric column, and you declared the $SQLColumn_xx variables as:
$SQLColumn_1: STRING; $SQLColumn_2: INTEGER;
then the following would fetch name into $SQLColumn_1, and age into $SQLColumn_2:
SQLSelectInto('name,age FROM emp',$SQLColumn_1,$SQLColumn_2);
and so would:
SQLSelectInto('name,age FROM emp',$SQLColumn_2,$SQLColumn_1);
例のような単純選択ストリングの場合には、SELECT キーワードは任意選択です。レコードを
パラメーターとして渡すことができますが、この場合には、フィールド名がテーブルの列名と
一致していなければなりません。そうでないと、フィールド名は無視されます。
同じタイプの 2 つのレコードを渡す場合には、SQLSelectInto が両方を満たします。 これによって、受動並行性を使用している時に、割り当てステップが節約されます。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS
VARIABLES (* 列 *) name: STRING; ssn: INTEGER; age: INTEGER; (* 各種 *) retCd : INTEGER; ACTIONS (* Indiana からすべての従業員を選択 *) retCd := SQLSelectInto('SELECT * from emp WHERE state = ''IN''', name, age, ssn); IF (retCd < 0) THEN EXIT retCd; END;
END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
構成またはコンテキスト状態オプションの値を設定します。
SQLSetOption(VAL option: STRING, VAL optionValue:<ANY SIMPLE VARIABLE> [,VAL srcOrConn : <INTEGER OR STRING EXPRESSION> ) : INTEGER;
SQLGetOption に渡されるオプション名は、SQL 構成ファイル (sai_sql.cfg) 内の オプションとは違って、区切り記号として下線ではなくスペースを使用します。
SQLGetOption を持つすべてのオプションを SQLSetOption で設定できるわけでは ありません。有効なオプションの完全なリスト、およびそれらのオプションを SQLSetOption で 変更できるかどうかの指定については、SQLGetOption の項目を参照してください。
引き数名 | 説明 |
option | オプションの名前、'DATE FORMAT' など |
optionValue | 設定するオプション値。 |
srcOrConn | この引き数は任意選択です。指定する場合には、ソース名 (STRING) か接続ハンドル (INTEGER) を入れなければなりません。この引き数が渡されないと、$CURRENT が仮定されます。 注: SQLGetOption と違って、Tivoli Service Desk Developer's
Toolkit は現在この引き数をサポートしていないので、これを指定しても無視されます。 |
この関数は成功またはエラー・コードを戻します。最も多いエラー・コードは次のものです: INVALID_OPTION および NOT_CONNECTED (接続が必要なオプションの場合には、これがほとんど 当てはまります)。
この関数は、前に SQLCommand('SET ... ') にあったほとんどの機能を組み込んでいます。各 パラメーター (デフォルトを含む) に関するその他の情報は、SQL 構成エディター内でそのパラメーターの ヘルプを呼び出して入手することができます。少数の例外を除けば、SQLGetOption を持つ パラメーターは SQLSetOption を使って設定することができます。使用可能なオプションのリスト については、SQLGetOption を参照してください (そこには設定できないオプションも含まれています)。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
PROCEDURE Example;
PRIVATE ROUTINES PROCEDURE Example IS VARIABLES retCd : INTEGER; ACTIONS retCd := SQLSetOption('CASE CONVERSION', 2); END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
パラメーター (列変数) に含まれている値を使って、指定された行を更新します。
SQLUpdate(tableName: STRING, queryString: STRING, parameters...] [,originalParameters...]): INTEGER;
注意: SQLUpdate を 1 回呼び出せば多数の行を更新できるので、照会条件を慎重に指定することが重要です
引き数名 | 説明 |
tableName | 更新するテーブルまたはビューの名前。 |
queryString | WHERE 文節。 |
parameter | これは、1 つ以上のパラメーター (列変数) をコンマで区切ったリストで、各パラメーターの名前は対応する列名と一致していなければなりません。 その他の情報については、このステートメントの「注」を参照してください。 |
originalParameters | これはパラメーターの任意選択セットで、最初のセットと同じものです。これらのパラメーターは受動並行性検査に使用されます。 その他の情報については、このステートメントの「注」を参照してください。 |
照会ストリング内の WHERE キーワードは任意選択です。SQLUpdate に渡される パラメーター (列変数) は、テーブルの実際の列と同じ名前を持っていなければなりません。 どの列名とも一致しないパラメーター名があると、そのパラメーターは無視されます。
NOT NULL オプションで作成されたテーブルの列を、$Unknown である Tivoli Service Desk Developer's Toolkit パラメーターを使って更新しないようにしてください。レコードを パラメーターとして渡すことができますが、この場合には、フィールド名がテーブルの列名と 一致していなければなりません。そうでないと、フィールド名は無視されます。
Tivoli Service Desk Developer's Toolkit は、受動並行性として知られている並行性手法に対する 組み込みサポートを備えています。受動並行性は、テーブルをロックしなくても複数のユーザーが そのテーブルにアクセスできるようにする、単純だが強力な手段です。これが受動といわれる意味は、 通常の方法でレコードにアクセスすればロックが能動的に適用されることがないからです。
受動並行性は次のように機能します。
注: レコード が 1 つしか渡されないと、SQLUpdate は受動並行性検査を行いません
レコードをパラメーターとして使用する必要はありません。受動並行性を使用する場合には、 パラメーターの 2 つのセットの順序が同じになるようにしてください。
NOT NULL オプションで作成されたテーブルの列を、$Unknown である Tivoli Service Desk Developer's Toolkit パラメーターを使って更新しないようにしてください。
KNOWLEDGEBASE の例; (* この例は受動並行性を行わない更新を示しています。*)
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* テーブル列 *) age: INTEGER; (* 各種 *) retCd : INTEGER; ACTIONS age := 29;
(* 30 以上のすべての女性従業員の年齢を 29 に設定 *) retCd := SQLUpdate('emp','age > 29',age); IF (retCd < 0) THEN EXIT retCd; END;
END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
パラメーター (列変数) 内の値を使って、カーソルが現在位置している行を更新します。
SQLUpdateCurrent(cursor: SQLCURSOR, parameters): INTEGER;
引き数名 | 説明 |
cursor | cursor は、SQLSelect を呼び出して前もってオープンしておかなければなりません。 |
parameters | これは、1 つ以上のパラメーター (列変数) をコンマで区切ったリストで、各パラメーターの名前は対応する列名と一致していなければなりません。 詳細については、「注」セクションを参照してください。 |
SQLUpdateCurrent は DB2 CLI ドライバーの場合にしかサポートされません。更新する各列を 選択ストリングの FOR UPDATE OF 文節に指定しなければなりません (SQLSelect ステートメントを 参照)。
SQLUpdateCurrent に渡されるパラメーター (列変数) は、テーブルの実際の列と同じ名前 を持っていなければなりません。どの列名とも一致しないパラメーター名があると、そのパラメーター は無視されます。レコードをパラメーターとして渡す場合があります。この場合には、フィールド名 がテーブルの列名と一致していなければなりません。そうでないと、フィールド名は無視されます。
注: 更新する すべての列に対して FOR UPDATE OF... 文節を使用する必要があります
NOT NULL オプションで作成されたテーブルの列を、$Unknown である Tivoli Service Desk Developer's Toolkit パラメーターを使って更新しないようにしてください。
KNOWLEDGEBASE の例;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* 列 *) name: STRING; (* 各種 *) cursor: SQLCursor; retCd : INTEGER; ACTIONS SQLBeginWork; (* トランザクションの開始 *)
(* この関数に渡された年齢より大きい年齢を持つすべての 従業員を *) (* Indiana から選択。*) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* トランザクションを終了しなければなりません *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* もしかすると、"name" に基づいていくつかの操作を実行 . . . *)
(* name を大文字に設定 *) name := StrUpper(name);
(* この行をただちに更新 *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* どの変更も取り消して、ロックを解除 *) EXIT retCd; END;
(* 次のレコードを取得 *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* 変更をコミットしてロックを解除 *) END;
戻りコード | 説明 |
1 | 正常終了 |
(その他) | Tivoli Service Desk 6.0 Developer's Toolkit Script プログラミングの手引き を参照 |
Tivoli Service Desk 6.0 Developer's Toolkit Script 言語解説書