...

C 組み込みパッケージ

by user

on
Category: Documents
143

views

Report

Comments

Transcript

C 組み込みパッケージ
C
ïtò^ C.
組み込みパッケージ
この付録では、DB2 9.7 でサポートされている以下の組み込みパッケージにつ
いて詳しく説明します。
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
򐂰
DBMS_OUTPUT
DBMS_ALERT
DBMS_PIPE
DBMS_JOB
DBMS_LOB
DBMS_SQL
DBMS_UTILITY
UTL_FILE
UTL_DIR
UTL_MAIL
UTL_SMTP
© Copyright IBM Corp. 2009.All rights reserved.
249
C.1 DBMS_OUTPUT
DBMS_OUTPUT パッケージには一連のプロシージャーが用意されており、こ
れらを使用すると、メッセージ・バッファーにテキスト行 ( メッセージ ) を書
き込んだり、メッセージ・バッファーからメッセージを取得したりすることに
よってメッセージ・バッファーでの作業が可能になります。これらのプロシー
ジャーは、アプリケーションのデバッグ時にメッセージを標準出力に書き込む
必要があるときに便利です。コマンド SET SERVEROUTPUT ON を使用する
と、出力を標準出力にリダイレクトすることができます。
表 C‐1 は、DBMS_OUTPUT モジュールに組み込まれているシステム定義ルー
チンをリストしたものです。
表 C‐1 DBMS_OUTPUT モジュールで使用できるシステム定義ルーチン
ルーチン名
説明
DISABLE プロシージャー
メッセージ・バッファーを使用不可にします。
ENABLE プロシージャー
メッセージ・バッファーを使用可能にします。
GET_LINE プロシージャー
メッセージ・バッファーから 1 行のテキストを取得し
ます。
GET_LINES プロシージャー
メッセージ・バッファーから 1 行以上のテキストを取
得し、そのテキストをコレクションに書き込みます。
NEW_LINE プロシージャー
メッセージ・バッファーに行末文字シーケンスを書き
込みます。
PUT プロシージャー
メッセージ・バッファーに行末文字シーケンスを含ま
ないストリングを書き込みます。
PUT_LINE プロシージャー
メッセージ・バッファーに行末文字シーケンスを含む 1 行を書き込みます。
例 C‐1 は DBMS_OUTPUT の例と、PUT プロシージャーと PUT_LINE プロシー
ジャーの出力を示しています。
例 C‐1 DBMS_OUTPUT プロシージャーを使用した匿名ブロック
SET SERVEROUTPUT ON
/
DECLARE
v_message VARCHAR2(50);
BEGIN
DBMS_OUTPUT.PUT(CHR(10));
DBMS_OUTPUT.PUT_LINE('This is the beginning');
DBMS_OUTPUT.PUT(CHR(10));
250
Oracle から DB2 への移行ガイド
v_message := 'You''re seeing now the second line.';
DBMS_OUTPUT.PUT_LINE(v_message);
END;
/
DB20000I The SQL command completed successfully.
This is the beginning
You're seeing now the second line.
C.2 DBMS_ALERT
DBMS_ALERT パッケージには、特定のイベントに対するアラートの登録、送
信、および受信を行うための一連のプロシージャーが含まれています。アラー
トは、SYSTOOLS.DBMS_ALERT_INFO に保管されます。これは、データベー
スごとにこのパッケージを初めて参照する際に SYSTOOLSPACE に作成されま
す。DBMS_ALERT パッケージを使用するには、データベース構成パラメー
ター CUR_COMMIT が ON に設定されていなければなりません。 表 C‐2 は、DBMS_ALERT モジュールに組み込まれているシステム定義ルーチ
ンをリストしています。
表 C‐2 DBMS_ALERT モジュールで使用できるシステム定義ルーチン
ルーチン名
説明
REGISTER プロシージャー
現行セッションを登録して、指定されたアラートを
受信します。
REMOVE プロシージャー
指定されたアラートの登録を除去します。
REMOVEALL プロシージャー
すべてのアラートの登録を除去します。
SIGNAL プロシージャー
指定されたアラートのオカレンスをシグナル通知
します。
SET_DEFAULTS プロシージャー
WAITONE プロシージャーおよび WAITANY プロ
シージャーのポーリング間隔を設定します。
WAITANY プロシージャー
任意の登録済みアラートの発生を待機します。
WAITONE プロシージャー
指定したアラートの発生を待機します。
付録 C. 組み込みパッケージ
251
例 C‐2 は、一部の ALERT 関連ルーチンの使用法を示しています。
“AlertFromTrigger” アラートは挿入操作の結果としてシグナル通知されると想
定します。このアラートにより、TRIGGER trig1 によって定義されたトリガー
が起動します。
例 C‐2 挿入トリガーによるシグナル通知
CREATE OR REPLACE TRIGGER TRIG1
AFTER INSERT ON T1alert
FOR EACH ROW
BEGIN
DBMS_ALERT.SIGNAL( 'alertfromtrigger', :NEW.C1 );
END;
/
例 C‐3 に示されているように、アラート名の登録後、WAITONE ルーチンを使
用してアラートをキャッチすることができます ( タイムアウト 60 秒 )。
例 C‐3 アラートの代行受信
DECLARE
v_stat1 INTEGER;
v_msg1 VARCHAR2(50);
BEGIN
DBMS_ALERT.REGISTER('alertfromtrigger');
DBMS_ALERT.WAITONE('alertfromtrigger', v_msg1, v_stat1, 60);
END;
/
DBMS_ALERT の詳細と例については、DB2 インフォメーション・センターの
以下のトピックを参照してください。
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.
rtn.doc/doc/r0053671.html
C.3 DBMS_PIPE
DBMS_PIPE パッケージには、同じデータベースに接続されたセッション内ま
たはセッション間のパイプを通して、メッセージを送信するための一連のルー
チンが含まれています。 パイプは、プロシージャー呼び出し時に明示的または暗黙的に作成されます。
存在しないパイプ名への参照がプロシージャー呼び出しに含まれていると、暗
黙的なパイプが作成されます。例えば、“mailbox” という名前のパイプが SEND_MESSAGE 関数に渡され、そのパイプがまだ存在しない場合、
252
Oracle から DB2 への移行ガイド
“mailbox” という新しいパイプが作成されます。CREATE_PIPE 関数を呼び出
してパイプ名を指定すると、明示的なパイプが作成されます。
パイプは、プライベートまたはパブリックのどちらにすることもできます。プ
ライベート・パイプにはパイプを作成したユーザーだけがアクセスできます。
他のユーザーが作成したプライベート・パイプには管理者でもアクセスできま
せん。パブリック・パイプは、DBMS_PIPE パッケージに対するアクセス権を
持つユーザーであれば誰でもアクセスできます。パイプに対するアクセス・レ
ベルを指定するには、CREATE_PIPE 関数を使用する際に、private パラメー
ターに以下の値を指定してください。 򐂰 “false” は、パイプがパブリックとなるように指定します。
򐂰 “true” は、パイプがプライベートとなるように指定します。 値を指定しない場合、デフォルトでプライベート・パイプが作成されます。暗
黙的に作成されるパイプはすべてプライベート・パイプです。
表 C‐3 は、DBMS_PIPE モジュールに組み込まれているシステム定義ルーチン
をリストしたものです。 表 C‐3 DBMS_PIPE モジュールで使用できるシステム定義ルーチン
ルーチン名
説明
CREATE_PIPE 関数
プライベート・パイプまたはパブリック・パイプを
明示的に作成します。
NEXT_ITEM_TYPE 関数
受信されたメッセージの次の項目のデータ・タイプ
を判別します。
PACK_MESSAGE 関数
項目をセッションのローカル・メッセージ・
バッファーに入れます。
PACK_MESSAGE_RAW プロシージャー
タイプ RAW の項目をセッションのローカル・
メッセージ・バッファーに入れます。
PURGE
プロシージャー
指定したパイプの受信されていないメッセージを
除去します。
RECEIVE_MESSAGE 関数
指定したパイプからメッセージを取得します。
REMOVE_PIPE 関数
明示的に作成されたパイプを削除します。
RESET_BUFFER プロシージャー
ローカル・メッセージ・バッファーをリセット
します。
SEND_MESSAGE プロシー
ジャー
指定したパイプにメッセージを送信します。
UNIQUE_SESSION_NAME 関数
ユニークなセッション名を戻します。
付録 C. 組み込みパッケージ
253
ルーチン名
説明
UNPACK_MESSAGE プロシージャー
メッセージから次のデータ項目を取得し、それを
変数に割り当てます。
パイプを通してメッセージを送信するには、PACK_MESSAGE 関数を呼び出し
て、現行セッションに対して固有なローカル・メッセージ・バッファーに個別
のデータ項目 ( 行 ) を書き出します。その後、SEND_MESSAGE 関数を実行し
て、パイプを通してメッセージを送信します。 メッセージを受信するには、RECEIVE_MESSAGE 関数を呼び出して、指定の
パイプからメッセージを取得します。メッセージは、受信セッションのローカ
ル・メッセージ・バッファーに書き込まれます。次に、UNPACK_MESSAGE プロシージャーを呼び出して、ローカル・メッセージ・バッファーから次の
データ項目を取得し、指定のプログラム変数にそれを割り当てます。パイプに
複数のメッセージが含まれる場合、RECEIVE_MESSAGE 関数は FIFO ( 先入れ
先出し法 ) の順序でメッセージを取得します。 それぞれのセッションは、PACK_MESSAGE 関数によって作成されたメッセー
ジ、および RECEIVE_MESSAGE 関数によって取得されたメッセージごとに別
個のメッセージ・バッファーを保守します。別個のメッセージ・バッファーを
使用することによって、同じセッションでメッセージを作成し、受信すること
ができます。ただし、RECEIVE_MESSAGE 関数が連続して呼び出される場合、
最後の RECEIVE_MESSAGE 呼び出しによるメッセージだけがローカル・メッ
セージ・バッファーに保持されます。
例 C‐4 には、パイプを作成し、そのパイプを通してメッセージを送信する簡単
な例が示されています。
例 C‐4 パイプを介したメッセージの送信
DECLARE
status
BEGIN
status
status
status
END;
/
INT;
:= DBMS_PIPE.CREATE_PIPE( 'pipe1' );
:= DBMS_PIPE.PACK_MESSAGE('message1');
:= DBMS_PIPE.SEND_MESSAGE( 'pipe1' );
例 C‐5 には、パイプからメッセージを読み取る方法が示されています。
例 C‐5 パイプからのメッセージの受信
DECLARE
status INTEGER;
254
Oracle から DB2 への移行ガイド
itemType INTEGER;
string1 VARCHAR(50);
BEGIN
status := DBMS_PIPE.RECEIVE_MESSAGE( 'pipe1' );
IF ( status = 0 ) THEN
itemType := DBMS_PIPE.NEXT_ITEM_TYPE();
IF ( itemType = 9 ) THEN
DBMS_PIPE.UNPACK_MESSAGE_CHAR( string1 );
DBMS_OUTPUT.PUT_LINE( 'string1 is: ' || string1 );
ELSE
DBMS_OUTPUT.PUT_LINE( 'unexpected data!');
END IF;
END IF;
END;
/
DBMS_PIPE の詳細と例については、DB2 インフォメーション・センターの以
下のトピックを参照してください。
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.
rtn.doc/doc/r0053678.html
C.4 DBMS_JOB
DBMS_JOB には、ジョブの作成、スケジューリング、および管理のための一連
のプロシージャーが含まれています。DBMS_JOB は、管理用タスク・スケ
ジューラー (ATS) に対する代替インターフェースとして機能します。
DBMS_JOB パッケージを使用するには、管理用タスク・スケジューラー (ATS) をアクティブにする必要があります。この機能はデフォルトではオフになって
いますが、ジョブ ( タスク ) の定義と変更は可能です。ATS を使用可能にする
には、以下のようにレジストリー変数を設定します。
db2set DB2_ATS_ENABLE=YES
このトピックに関する詳細は、インフォメーション・センターの以下のトピッ
ク『管理用タスク・スケジューラーのセットアップ』を参照してください。
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admi
n.gui.doc/doc/t0054396.html
例 C‐6 には job_proc というジョブを SYSDATE に実行し、その後、
SYSDATE+1 に自動的に実行するようにスケジュールする方法が示されています。
例 C‐6 DBMS_JOB の例
CREATE OR REPLACE PROCEDURE job_proc
IS
付録 C. 組み込みパッケージ
255
BEGIN
INSERT INTO jobrun VALUES ('job_proc run at ' || TO_CHAR(SYSDATE,
'yyyy-mm-dd hh24:mi:ss'));
END;
/
DECLARE
jobid
BEGIN
INTEGER;
DBMS_JOB.SUBMIT(jobid,'job_proc;',SYSDATE, 'SYSDATE + 1');
END;
/
C.5 DBMS_LOB
DBMS_LOB には、ラージ・オブジェクト (LOB) を操作するための一連のルー
チンが含まれています。例 C‐7 では、DB2 コマンド行から APPEND ルーチン
と ERASE ルーチンを呼び出し、LOB で実行されるアクションが簡単に示され
ています。
例 C‐7 DBMS_LOB の例
call DBMS_LOB.APPEND_CLOB('ABCD','1234')
Value of output parameters
-------------------------Parameter Name : DEST_LOB
Parameter Value : ABCD1234
Return Status = 0
call DBMS_LOB.ERASE_CLOB('DBMS', 1,3)
Value of output parameters
-------------------------Parameter Name : LOB_LOC
Parameter Value : DB S
Parameter Name : AMOUNT
Parameter Value : 1
ReturnStatus=0
256
Oracle から DB2 への移行ガイド
例 C‐8 に示されているように、簡単な匿名ブロックを使用することもできます。 例 C‐8 匿名ブロックでの DBMS_LOB DECLARE
v_dest_lob CLOB := 'ABCD';
BEGIN
DBMS_OUTPUT.PUT_LINE('Original lob: ' || v_dest_lob);
DBMS_LOB.APPEND_CLOB(v_dest_lob,'1234');
DBMS_OUTPUT.PUT_LINE('New lob : ' || v_dest_lob);
END;
/
DECLARE
v_dest_lob CLOB := 'DBMS';
v_amount INTEGER := 1;
BEGIN
DBMS_OUTPUT.PUT_LINE('Original lob: ' || v_dest_lob);
DBMS_LOB.ERASE_CLOB(v_dest_lob, v_amount, 3);
DBMS_OUTPUT.PUT_LINE('New lob : ' || v_dest_lob);
DBMS_OUTPUT.PUT_LINE('Amount : ' || v_amount);
END;
/
C.6 DBMS_SQL
DBMS_SQL パッケージには、さまざまな DML ステートメントや DDL ステー
トメントをサポートできるように、動的 SQL を実行するための一連のプロシー
ジャーが含まれています。DBMS_SQL パッケージ内のルーチンは、動的 SQL ステートメントを構成および実行する場合、または SQL ステートメントから動
的 SQL を使用する関数を呼び出す場合に役立ちます。また、ALTER TABLE や DROP TABLE などの一部の DDL コマンドを「オンザフライ」で作成および実
行できます。 表 C‐4 は、DBMS_SQL モジュールに組み込まれているシステム定義ルーチンを
リストしています。 表 C‐4 DBMS_SQL モジュールで使用できるシステム定義ルーチン
プロシージャー名
説明
BIND_VARIABLE_BLOB プロシージャー
IN または INOUT パラメーターに入力 BLOB 値
を提供します。さらに、INOUT または OUT パ
ラメーターの出力値のデータ・タイプを BLOB として定義します。
付録 C. 組み込みパッケージ
257
258
プロシージャー名
説明
BIND_VARIABLE_CHAR プロシージャー
IN または INOUT パラメーターに入力 CHAR 値
を提供します。さらに、INOUT または OUT パ
ラメーターの出力値のデータ・タイプを CHAR として定義します。
BIND_VARIABLE_CLOB プロシージャー
IN または INOUT パラメーターに入力 CLOB 値
を提供します。さらに、INOUT または OUT パ
ラメーターの出力値のデータ・タイプを CLOB として定義します。
BIND_VARIABLE_DATE プロシージャー
IN または INOUT パラメーターに入力 DATE 値
を提供します。さらに、INOUT または OUT パ
ラメーターの出力値のデータ・タイプを DATE として定義します。
BIND_VARIABLE_DOUBLE プロシージャー
IN または INOUT パラメーターに入力 DOUBLE 値を提供します。さらに、INOUT または OUT パラメーターの出力値のデータ・タイプを DOUBLE として定義します。
BIND_VARIABLE_INT プロシージャー
IN または INOUT パラメーターに入力 INTEGER 値を提供します。さらに、INOUT ま
たは OUT パラメーターの出力値のデータ・タ
イプを INTEGER として定義します。
BIND_VARIABLE_NUMBER プロシージャー
IN または INOUT パラメーターに入力 DECFLOAT 値を提供します。さらに、INOUT または OUT パラメーターの出力値のデータ・
タイプを DECFLOAT として定義します。
BIND_VARIABLE_RAW プロシージャー
IN または INOUT パラメーターに入力 BLOB(32767) 値を提供します。さらに、INOUT または OUT パラメーターの出力値のデータ・
タイプを BLOB(32767) として定義します。
BIND_VARIABLE_TIMESTAMP プロシージャー
IN または INOUT パラメーターに入力 TIMESTAMP 値を提供します。さらに、INOUT または OUT パラメーターの出力値のデータ・
タイプを TIMESTAMP として定義します。
BIND_VARIABLE_VARCHAR プロシージャー
IN または INOUT パラメーターに入力 VARCHAR 値を提供します。さらに、INOUT または OUT パラメーターの出力値のデータ・
タイプを VARCHAR として定義します。
CLOSE_CURSOR プロシージャー
カーソルをクローズします。
COLUMN_VALUE_BLOB プロシージャー
タイプ BLOB の列の値を取り出します。
Oracle から DB2 への移行ガイド
プロシージャー名
説明
COLUMN_VALUE_CHAR プロシージャー
タイプ CHAR の列の値を取り出します。
COLUMN_VALUE_CLOB プロシージャー
タイプ CLOB の列の値を取り出します。
COLUMN_VALUE_DATE プロシージャー
タイプ DATE の列の値を取り出します。
COLUMN_VALUE_DOUBLE プロシージャー
タイプ DOUBLE の列の値を取り出します。
COLUMN_VALUE_INT プロシージャー
タイプ INTEGER の列の値を取り出します。
COLUMN_VALUE_LONG プロシージャー
タイプ CLOB(32767) の列の値を取り出します。
COLUMN_VALUE_NUMBER プロシージャー
タイプ DECFLOAT の列の値を取り出します。
COLUMN_VALUE_RAW プロシージャー
タイプ BLOB(32767) の列の値を取り出します。
COLUMN_VALUE_TIMESTAMP プロシージャー
タイプ TIMESTAMP の列の値を取り出します。
COLUMN_VALUE_VARCHAR プ
ロシージャー
タイプ VARCHAR の列の値を取り出します。
DEFINE_COLUMN_BLOB プロシージャー
列のデータ・タイプを BLOB として定義します。
DEFINE_COLUMN_CHAR プロシージャー
列のデータ・タイプを CHAR として定義しま
す。
DEFINE_COLUMN_CLOB プロシージャー
列のデータ・タイプを CLOB として定義しま
す。
DEFINE_COLUMN_DATE プロシージャー
列のデータ・タイプを DATE として定義しま
す。
DEFINE_COLUMN_DOUBLE プロシージャー
列のデータ・タイプを DOUBLE として定義し
ます。
DEFINE_COLUMN_INT
プロシージャー
列のデータ・タイプを INTEGER として定義し
ます。
DEFINE_COLUMN_LONG プロシージャー
列のデータ・タイプを CLOB(32767) として定義
します。
付録 C. 組み込みパッケージ
259
260
プロシージャー名
説明
DEFINE_COLUMN_NUMBER プロシージャー
列のデータ・タイプを DECFLOAT として定義
します。
DEFINE_COLUMN_RAW プロシージャー
列のデータ・タイプを BLOB(32767) として定義
します。
DEFINE_COLUMN_TIMESTAMP プロシージャー
列のデータ・タイプを TIMESTAMP として定義
します。
DEFINE_COLUMN_VARCHAR プロシージャー
列のデータ・タイプを VARCHAR として定義し
ます。
DESCRIBE_COLUMNS プロシージャー
カーソルによって取り出された列の記述を戻し
ます。
DESCRIBE_COLUMNS2 プロシージャー
32 文字を超える列名が許可されるという点以外
は、DESCRIBE_COLUMNS と同じです。
EXECUTE プロシージャー
カーソルを実行します。
EXECUTE_AND_FETCH プロシージャー
カーソルを実行し、1 行をフェッチします。
FETCH_ROWS プロシージャー
カーソルから行をフェッチします。
IS_OPEN プロシージャー
カーソルがオープンされているかどうかを検査
します。
LAST_ROW_COUNT プロシー
ジャー
フェッチされた行の総数を戻します。
OPEN_CURSOR プロシージャー
カーソルをオープンします。
PARSE プロシージャー
DDL ステートメントを解析します。
VARIABLE_VALUE_BLOB プロシージャー
INOUT または OUT パラメーターの値を BLOB として取り出します。
VARIABLE_VALUE_CHAR プロシージャー
INOUT または OUT パラメーターの値を CHAR として取り出します。
VARIABLE_VALUE_CLOB プロシージャー
INOUT または OUT パラメーターの値を CLOB として取り出します。
VARIABLE_VALUE_DATE プロシージャー
INOUT または OUT パラメーターの値を DATE として取り出します。
VARIABLE_VALUE_DOUBLE プロシージャー
INOUT または OUT パラメーターの値を DOUBLE として取り出します。
Oracle から DB2 への移行ガイド
プロシージャー名
説明
VARIABLE_VALUE_INT プロシージャー
INOUT または OUT パラメーターの値を INTEGER として取り出します。
VARIABLE_VALUE_NUMBER プロシージャー
INOUT または OUT パラメーターの値を DECFLOAT として取り出します。
VARIABLE_VALUE_RAW プロシージャー
INOUT または OUT パラメーターの値を BLOB(32767) として取り出します。
VARIABLE_VALUE_TIMESTAMP プロシージャー
INOUT または OUT パラメーターの値を TIMESTAMP として取り出します。
VARIABLE_VALUE_VARCHAR プロシージャー
INOUT または OUT パラメーターの値を VARCHAR として取り出します。
前述のように、このモジュール内の一部のプロシージャーには、Oracle パッ
ケージ内の対応する名前よりも詳細な名前が付けられています。 例えば、
DBMS_SQL.COLUMN_VALUE プロシージャーの名前は、扱うデータ・タイプ
によって、COLUMN_VALUE_NUMBER、 COLUMN_VALUE_CHAR、または COLUMN_VALUE_DATE のように修飾できます。これらは、バインドされる
データ・タイプです。
表 C‐5 は、DBMS_SQL パッケージで使用できるシステム定義タイプと定数をリ
ストしたものです。
表 C‐5 DBMS_SQL システム定義のタイプと定数
名前
タイプまたは
定数
説明
DESC_REC
タイプ
列情報のレコード。
DESC_REC2
タイプ
列情報のレコード。
DESC_TAB
タイプ
タイプ DESC_REC のレコードの配列。
DESC_TAB2
タイプ
タイプ DESC_REC2 のレコードの配列。
NATIVE
定数
PARSE プロシージャーの language_flag パラメー
ターに対して唯一サポートされる値。
C.7 DBMS_UTILITY
DBMS_UTILITY パッケージには、データベースまたはスキーマの分析、オブ
ジェクトのコンパイルや妥当性検査、DDL ステートメントの実行、さらには
データベース・オブジェクト、データベース・バージョン、および CPU に関す
付録 C. 組み込みパッケージ
261
る情報の取得、および他の機能を実行するための種々のユーティリティー・プ
ログラムが含まれています。
表 C‐6 は、DBMS_UTILITY モジュールで使用できるシステム定義ルーチンをリ
ストしています。
表 C‐6 DBMS_UTILITY モジュールで使用できるシステム定義ルーチン
262
ルーチン名
説明
ANALYZE_DATABASE プロシージャー
データベースの表、クラスター、および索引で統計
を収集する機能を提供します。
ANALYZE_PART_OBJECT プロシージャー
パーティション表またはパーティション索引を分析
します。
ANALYZE_SCHEMA プロシージャー
指定のスキーマの表、クラスター、および索引に関
する統計を収集する機能を提供します。
CANONICALIZE プロシージャー
ストリングを正規化します ( 例えば、空白文字を取
り除きます )。
COMMA_TO_TABLE プロシージャー
名前のコンマ区切りリストを、名前の配列に変換し
ます。リスト内の各項目が、配列の要素になります。
COMPILE_SCHEMA プロシージャー
スキーマ内のすべてのオブジェクト ( 関数、プロ
シージャー、トリガー、パッケージなど ) を再コン
パイルします。
DB_VERSION プロシー
ジャー
データベースのバージョン番号を戻します。
EXEC_DDL_STATEMENT プロシージャー
DDL ステートメントを実行します。
GET_CPU_TIME 関数
任意の時点からの CPU 時間を、100 分の 1 秒単位で
戻します。
GET_DEPENDENCY プロシージャー
指定のオブジェクトに従属するすべてのオブジェク
トをリストします。
GET_HASH_VALUE 関数
特定のストリングのハッシュ値を計算します。
GET_TIME 関数
現在時刻を 100 分の 1 秒単位で戻します。
NAME_RESOLVE プロシージャー
データベース・オブジェクトのスキーマおよび他の
メンバーシップ情報を取得します ( シノニムは、
それらの基本オブジェクトに解決されます )。
NAME_TOKENIZE
プロシージャー
指定された名前をその構成要素部分に解析します
(二重引用符がない名前は大文字に変換され、二重引
用符がある名前からは二重引用符が除去されます)。
Oracle から DB2 への移行ガイド
ルーチン名
説明
TABLE_TO_COMMA プロシージャー
名前の配列を、名前のコンマ区切りリストに変換し
ます。各配列要素は、リスト項目になります。
VALIDATE プロシージャー
無効なルーチンの状態を有効に変更する機能を提供
します。
表 C‐7 は、DBMS_UTILITY パッケージで使用できるシステム定義変数とタイプ
をリストしたものです。
表 C‐7 DBMS_UTILITY パブリック変数
パブリック変数
データ・タイプ
説明
lname_array
TABLE
長い名前のリスト用
uncl_array
TABLE
ユーザーおよび名前のリスト用
例 C‐9 には、COMMA_TO_TABLE を使用してコンマ区切りリストを表に変更
する方法が示されています。
例 C‐9 COMMA_TO_TABLE の例
CREATE OR REPLACE PROCEDURE comma_to_table (
p_list
VARCHAR2
)
IS
r_lname
DBMS_UTILITY.LNAME_ARRAY;
v_length
BINARY_INTEGER;
BEGIN
DBMS_UTILITY.COMMA_TO_TABLE_LNAME(p_list,v_length,r_lname);
FOR i IN 1..v_length LOOP
DBMS_OUTPUT.PUT_LINE(r_lname(i));
END LOOP;
END;
call comma_to_table('schema.dept, schema.emp, schema.jobhist')
schema.dept
schema.emp
schema.jobhist
これらのプロシージャーと変数の使用法の詳細および例については、DB2 イン
フォメーション・センターの以下のトピックを参照してください。
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.
rtn.doc/doc/r0055155.html
付録 C. 組み込みパッケージ
263
C.8 UTL_FILE
UTL_FILE パッケージには、データベース・サーバーのファイル・システム上
のファイルとの間で読み取りおよび書き込みを行うための一連のルーチンが含
まれています。表 C‐8 は、UTL_FILE モジュールで使用できるシステム定義
ルーチンをリストしています。
表 C‐8 UTL_FILE モジュールのシステム定義ルーチン
ルーチン名
説明
FCLOSE プロシージャー
指定のファイルをクローズします。
FCLOSE_ALL プロシージャー
オープンしているファイルをすべてクローズします。
FCOPY プロシージャー
あるファイルから別のファイルにテキストをコピー
します。
FFLUSH プロシージャー 書き込まれていないデータをファイルにフラッシュ
します。
FOPEN 関数
ファイルをオープンします。
FREMOVE プロシージャー
ファイルを除去します。
FRENAME プロシージャー
ファイルの名前を変更します。
GET_LINE プロシージャー
ファイルから行を取得します。
IS_OPEN 関数
指定のファイルがオープンされているかどうかを判別
します。
NEW_LINE プロシージャー
行末文字シーケンスをファイルに書き込みます。
PUT プロシージャー
ストリングをファイルに書き込みます。
PUT_LINE プロシージャー
単一の行をファイルに書き込みます。
PUTF プロシージャー
フォーマット済みストリングをファイルに書き込み
ます。
UTL_FILE.FILE_TYPE プロシージャー ファイル・ハンドルを保管します。
表 C‐9 は、アプリケーションが受け取る可能性のある名前付き条件 (Oracle で
は「例外」と呼ばれます ) をリストしています。
264
Oracle から DB2 への移行ガイド
表 C‐9 アプリケーションの名前付き条件
条件名
説明
access_denied
ファイルへのアクセスが、オペレーティング・システムに
よって拒否されました。
charsetmismatch
ファイルは、FOPEN_NCHAR を使用してオープンされまし
たが、その後の入出力操作で PUTF または GET_LINE など
の非文字関数が使用されました。
delete_failed
ファイルを削除できませんでした。
file_open
ファイルは既にオープンされています。
internal_error
UTL_FILE パッケージの未処理の内部エラー。
invalid_filehandle
ファイル・ハンドルは存在しません。
invalid_filename
指定された名前のファイルはパスに存在しません。
invalid_maxlinesize
FOPEN の MAX_LINESIZE 値が無効です。1 から 32672 の
範囲でなければなりません。
invalid_mode
FOPEN の open_mode 引数は無効です。
invalid_offset
FSEEK の ABSOLUTE_OFFSET 引数が無効です。0 より
大きく、ファイルの合計バイト数より小さくなければなりま
せん。
invalid_operation
ファイルは要求どおりにオープンできなったか、操作できま
せんでした。
invalid_path
指定のパスが存在しないか、データベースに対して不可視
です。
read_error
ファイルを読み取れません。
rename_failed
ファイルの名前を変更できません。
write_error
ファイルに書き込めません。
付録 C. 組み込みパッケージ
265
Oracle では、UTL_FILE パッケージを使用する前に、CREATE OR REPLACE DIRECTORY コマンドを使用して、ファイルが配置されるファイル・システ
ム・ディレクトリーを作成する必要があります。これは DDL ステートメント
であるため、PL/SQL コードにこのコマンドを取り込むには EXECUTE IMMEDIATE ステートメントを使用しなければなりません。DB2 を使用すると
これを簡単に実装できます。ファイル・システム上のディレクトリーを参照す
るには、ディレクトリー別名を使用するだけです。別名は UTL_DIR.CREATE_DIRECTORY または UTL_DIR.CREATE_OR_REPLACE_DIRECTORY システム・プロシージャーを
直接呼び出して作成できます。
例 C‐10 には、両方のステートメントの比較が記されています。 例 C‐10 Oracle と DB2 におけるディレクトリー作成ステートメント
-- Oracle syntax:
CREATE OR REPLACE DIRECTORY mydir AS 'home/user/temp/mydir';
-- DB2 syntax:
BEGIN
UTL_DIR.CREATE_DIRECTORY('mydir', '/home/user/temp/mydir');
END;
/
UTL_DIR パッケージの詳細については、266 ページの『UTL_DIR』 を参照して
ください。 UTL_FILE パッケージは DB2 インスタンス・ユーザー ID の認証を使用して
ファイル操作を実行するので、DB2 インスタンス・ユーザー ID が適切なオペ
レーティング・システム権限を持っていることを確認してください。
C.9 UTL_DIR
UTL_DIR パッケージには、UTL_FILE パッケージで使用するディレクトリー別
名を保守するための一連のルーチンが含まれています。このパッケージを使用
すると、ディレクトリー別名を作成 ( あるいは作成または置換 )、ドロップ、お
よびディレクトリー別名に関する情報を収集できます。
例 C‐11 は、ディレクトリー別名の対応パスを取得する方法を例示しています。
266
Oracle から DB2 への移行ガイド
例 C‐11 ディレクトリー別名のパスの取得
SET SERVEROUTPUT ON
/
DECLARE
v_dir VARCHAR2(200);
BEGIN
UTL_DIR.GET_DIRECTORY_PATH('mydir', v_dir );
DBMS_OUTPUT.PUT_LINE('Directory path: ' || v_dir);
END;
/
--This example results in the following output:
Value of output parameters
-------------------------Parameter Name : PATH
Parameter Value : home/myuser/temp/mydir
Return Status = 0
266 ページの例 C‐10 は、ディレクトリー別名の作成方法を示しています。別の
方法としては、CREATE_OR_REPLACE_DIRECTORY プロシージャーを使用す
ることもできます。ディレクトリー情報は SYSTOOLS.DIRECTORIES に保管さ
れます。これは、データベースごとにこのパッケージを初めて参照する際に SYSTOOLSPACE に作成されます。
267 ページの例 C‐12 では、DROP_DIRECTORY プロシージャーを使用して指
定のディレクトリー別名をドロップします。
例 C‐12 ディレクトリー別名のドロップ
BEGIN
UTL_DIR.DROP_DIRECTORY('mydir');
END;
/
C.10 UTL_MAIL
UTL_MAIL パッケージには、添付ファイル付き、または添付ファイルなしで E メールを送信する機能が含まれています。UTL_MAIL パッケージを使用して正
常に E メール・メッセージを送信するには、データベース構成パラメーター SMTP_SERVER に有効な SMTP (Simple Mail Transfer Protocol) サーバーのアド
レスを 1 つ以上含める必要があります。 付録 C. 組み込みパッケージ
267
表 C‐10 は、UTL_MAIL モジュールに組み込まれているシステム定義ルーチン
をリストしたものです。
表 C‐10 UTL_MAIL モジュールで使用できるシステム定義ルーチン
ルーチン名
説明
SEND プロシージャー
E メールをパッケージして、SMTP サーバーに送信
します。
SEND_ATTACH_RAW プロシージャー
SEND プロシージャーと同様ですが、BLOB ( バイ
ナリー ) 添付ファイルがあります。
SEND_ATTACH_VARCHAR2 SEND プロシージャーと同様ですが、VARCHAR
プロシージャー
(テキスト) 添付ファイルがあります。
例 C‐13 は、SMTP サーバー項目のセットアップ方法を示しています。複数の SMTP サーバーをセットアップするには、それぞれをコンマで区切り、別々の
ポート番号を指定してください。E メールは、いずれかの SMTP サーバーから
成功応答を受信するまで、リストの順序で各 SMTP サーバーに送信されます。
例 C‐13 SMTP サーバー項目のセットアップ
-- Set up a single SMTP serMver that uses port 2000:
-- (if a port is not specified, the default port 25 will be used)
db2 update db cfg using smtp_server 'smtp2.ibm.com:2000'
--- Set up a list of SMTP server
db2 update db cfg using smtp_server
'smtp1.example.com, smtp2.example.com:23, smtp3.example.com:2000'
例 C‐14 は、E メール・メッセージを送信する匿名ブロックを例示しています。
例 C‐14 UTL_MAIL パッケージを使用した E メールの送信
DECLARE
v_sender
VARCHAR2(50);
v_recipients
VARCHAR2(50);
v_subj
VARCHAR2(250);
v_msg
VARCHAR2(200);
BEGIN
v_sender := '[email protected]';
v_recipients := '[email protected], recipient2@ mycompany.com';
v_subj := 'Test UTL_MAIL package on DB2';
v_msg := ' UTL_MAIL package works great! ' ||
'Please, setup properly your server!';
UTL_MAIL.SEND(v_sender,v_recipients,NULL,NULL,v_subj,v_msg);
END;
/
268
Oracle から DB2 への移行ガイド
C.11 UTL_SMTP
UTL_SMTP パッケージには、SMTP を介して E メールを送信する一連のルーチ
ンが含まれています。 表 C‐11 は、UTL_SMTP モジュールに組み込まれているシステム定義ルーチン
をリストしています。
表 C‐11 UTL_SMTP モジュールで使用できるシステム定義ルーチン
ルーチン名
説明
CLOSE_DATA プロシージャー
E メール・メッセージを終了します。
COMMAND プロシージャー
SMTP コマンドを実行します。 COMMAND_REPLIES プロシージャー
複数の応答行が予想される場合に、SMTP コマンドを実
行します。 DATA プロシージャー
E メール・メッセージの本文を指定します。
EHLO プロシージャー
SMTP サーバーとの初期ハンドシェークを実行し、拡張
情報を戻します。
HELO プロシージャー
SMTP サーバーとの初期ハンドシェークを実行します。
HELP プロシージャー
HELP コマンドを送信します。
MAIL プロシージャー
メール・トランザクションを開始します。
NOOP プロシージャー
ヌル・コマンドを送信します。
OPEN_CONNECTION 関数
接続を開きます。
OPEN_CONNECTION プロシージャー
接続を開きます。
OPEN_DATA プロシージャー
DATA コマンドを送信します。
QUIT プロシージャー
SMTP セッションを終了し、切断します。
RCPT プロシージャー
E メール・メッセージの受信者を指定します。
RSET プロシージャー
現在のメール・トランザクションを終了します。
VRFY プロシージャー
E メール・アドレスを妥当性検査します。
付録 C. 組み込みパッケージ
269
ルーチン名
説明
WRITE_DATA プロシージャー
E メール・メッセージの一部分を書き込みます。
WRITE_RAW_DATA プロシージャー
RAW データで構成される E メール・メッセージの一部分
を書き込みます。
表 C‐12 は、このパッケージで使用できるパブリック変数をリストしたもので
す。
表 C‐12 . UTL_SMTP パッケージで使用できるシステム定義タイプ
パブリック変数
データ・
タイプ
説明
connection
RECORD
SMTP 接続の記述を提供します。
reply
RECORD
SMTP 応答行の記述を提供します (REPLIES は、SMTP 応答行の配列です )。
例 C‐15 のプロシージャー send_mail は、UTL_SMTP パッケージと UTL_SMTP.DATA メソッドを使用してテキスト E メール・メッセージを作成し
て送信します。またこの例は、このプロシージャーの呼び出し方法についても
例示しています。
例 C‐15 UTL_SMTP パッケージによるメッセージの送信
CREATE OR REPLACE PROCEDURE send_mail (
p_sender
VARCHAR2,
p_recipient
VARCHAR2,
p_subj
VARCHAR2,
p_msg
VARCHAR2,
p_mailhost
VARCHAR2
)
IS
v_conn
UTL_SMTP.CONNECTION;
v_crlf
CONSTANT VARCHAR2(2) := CHR(13) || CHR(10);
v_port
CONSTANT PLS_INTEGER := 25;
BEGIN
UTL_SMTP.OPEN_CONNECTION(p_mailhost,v_port, v_conn, 20, v_reply);
UTL_SMTP.HELO(v_conn,p_mailhost);
UTL_SMTP.MAIL(v_conn,p_sender);
UTL_SMTP.RCPT(v_conn,p_recipient);
UTL_SMTP.DATA(v_conn, SUBSTR(
'Date: ' || TO_CHAR(SYSDATE,
'Dy, DD Mon YYYY HH24:MI:SS') || v_crlf
|| 'From: ' || p_sender || v_crlf
|| 'To: ' || p_recipient || v_crlf
|| 'Subject: ' || p_subj || v_crlf
270
Oracle から DB2 への移行ガイド
|| p_msg
, 1, 32767));
UTL_SMTP.QUIT(v_conn);
END;
/
call send_mail('[email protected]', 'name2@ mycompany.com', 'Test UTL_SMTP
package on DB2','Please, setup properly your server!','smtp.mycompany.com');
例 C‐16 では、DATA プロシージャーではなく、OPEN_DATA、 WRITE_DATA、
および CLOSE_DATA プロシージャーを使用しています。send_mail_2 プロ
シージャーへの呼び出しは、271 ページの例 C‐15 の send_mail の呼び出しと同
じです。 例 C‐16 UTL_SMTP パッケージによるメッセージの送信 CREATE OR REPLACE PROCEDURE send_mail_2 (
p_sender
VARCHAR2,
p_recipient
VARCHAR2,
p_subj
VARCHAR2,
p_msg
VARCHAR2,
p_mailhost
VARCHAR2
)
IS
v_conn
UTL_SMTP.CONNECTION;
v_crlf
CONSTANT VARCHAR2(2) := CHR(13) || CHR(10);
v_port
CONSTANT PLS_INTEGER := 25;
BEGIN
UTL_SMTP.OPEN_CONNECTION(p_mailhost,v_port,v_conn, 20, v_reply);
UTL_SMTP.HELO(v_conn,p_mailhost);
UTL_SMTP.MAIL(v_conn,p_sender);
UTL_SMTP.RCPT(v_conn,p_recipient);
UTL_SMTP.OPEN_DATA(v_conn);
UTL_SMTP.WRITE_DATA(v_conn,'From: ' || p_sender || v_crlf);
UTL_SMTP.WRITE_DATA(v_conn,'To: ' || p_recipient || v_crlf);
UTL_SMTP.WRITE_DATA(v_conn,'Subject: ' || p_subj || v_crlf);
UTL_SMTP.WRITE_DATA(v_conn,v_crlf || p_msg);
UTL_SMTP.CLOSE_DATA(v_conn);
UTL_SMTP.QUIT(v_conn);
END;
/
付録 C. 組み込みパッケージ
271
272
Oracle から DB2 への移行ガイド
Fly UP