Comments
Description
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 への移行ガイド