このセクションでは、データベース・リンクの確立、コレクションの使用、バックグラウンドSQLの実行、Webサービスの使用、ユーザー・プリファレンスの管理など、高度なプログラミング手法について説明します。
内容は次のとおりです。
「作業領域」ホームページはOracleデータベース上で実行されるため、ユーザーは、すべての分散Oracleデータベース機能を使用できます。 通常、分散データベース操作は、データベース・リンクを使用して実行します。
データベース・リンクは1つのデータベースのスキーマ・オブジェクトであり、これを使用すると、別のデータベース上のオブジェクトにアクセスできます。 データベース・リンクを作成すると、表名またはビュー名に@dblink
を追加することによって、リモート・オブジェクトにアクセスできます。この場合のdblink
は、「データベース・オブジェクトの作成」ウィザードで指定するデータベース・リンク名です。
注意: デフォルトでは、割当て済の作業領域またはデータベース・ユーザーに「CREATE DATABASE LINK」システム権限は付与されていません。 この機能を使用するには、DBAまたは管理者は、ユーザーの作業領域のデータベース・ユーザーにこの特別な権限を付与する必要があります。 詳細は、『Oracle Database管理者ガイド』の「データベース・リンクの作成」を参照してください。 |
データベース・リンクを作成するには、次のステップを実行します。
「作業領域」ホームページで「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。
オブジェクト・ブラウザが表示されます。
「作成」をクリックします。
「データベース・リンク」を選択して、「次へ」をクリックします。
画面に表示されるステップに従います。
データベース・リンク名は、Oracleのネーミング規則に従う必要があり、空白を含めたり、数字やアンダースコアから開始することはできません。
既存のデータベース・リンクを表示するには、次のステップを実行します。
「作業領域」ホームページで「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。
オブジェクト・ブラウザが表示されます。
ページ上部にあるオブジェクト・タイプ「データベース・リンク」を選択します。
このセクションでは、アプリケーション・ビルダー・アプリケーションから電子メールを送信する方法を説明します。 アプリケーション・ビルダー・アプリケーションから電子メールを送信するには、最初に「電子メールの環境設定」を構成する必要があります。
このセクションの内容は次のとおりです。
ユーザーがログイン・ページのリンクを使用して作業領域をリクエストしたり、パスワードを再設定するには、メールを送信するようにOracle Application Expressを構成する必要があります。 Oracle Application Expressによるメールの送信を有効にするには、「環境プリファレンス」ページで多くの設定を構成する必要があります。
メールを送信するようにOracle Application Expressを構成するには、次のステップを実行します。
Oracle Application Express管理サービスにログインします。 「Oracle Application Express管理サービスへのログイン」を参照してください。
「サービスの管理」をクリックします。
「環境設定の管理」をクリックします。
「電子メール」で、次のように入力します。
SMTPホスト・アドレス(SMTP_HOST_ADDRESS): SMTPサーバーのサーバー・アドレスを定義します。 これは、インストール時にlocalhost
に設定されます。 別のサーバーをSMTPリレーまたはメール・サーバーとして使用する場合は、localhostをそのサーバーの名前またはアドレスに変更します。
SMTPホスト・ポート: SMTPサーバーがメール・リクエストをリスニングするポートを定義します。 デフォルトでは、インストール時に25に設定されます。
管理電子メール・アドレス: 電子メールを生成するための、割当てリクエストの承認、パスワードの再設定などの管理タスク用の送信元アドレスを定義します。
「変更の適用」をクリックします。
次の方法でアプリケーション・ビルダー・アプリケーションから電子メールを送信できます。
バックグラウンド・ジョブを作成して、アクティブなメール・キューに格納されているすべてのメール・メッセージを定期的に送信する
PL/SQLパッケージAPEX_MAIL
をコールする
このセクションの内容は次のとおりです。
Oracle Application Expressでは、未送信の電子メール・メッセージは、APEX_MAIL_QUEUE
という表に格納されます。 DBMS_JOB
バックグラウンド・プロセスは、Oracle Application Expressのインストール時に自動的に作成されます。 バックグラウンド・プロセスは、15分ごとにメール・キューを送信します。 デフォルトでは、このジョブ番号は4002です。Application Expressスキーマ(FLOWS_020200
)に作成されます。
電子メールを送信するための最も有効な方法は、バックグラウンド・ジョブ(DBMS_JOB
パッケージを使用)を作成して、アクティブなメール・キューに格納されているすべてのメール・メッセージを定期的に送信することです。
APEX_MAIL
というPL/SQLパッケージをコールすることによって、Oracle Application Expressアプリケーションから電子メールを送信することもできます。 このパッケージは、Oracleで提供されるUTL_SMTP
パッケージをベースとして構築されています。 このような依存性があるため、APEX_MAIL
を使用するには、UTL_SMTP
パッケージがインストール済で機能している必要があります。
参照: UTL_SMTPパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。「APEX_MAIL」も参照してください。 |
APEX_MAIL
には、電子メールを手動で送信するための次の2つのプロシージャが含まれています。
アプリケーションから外部へ電子メール・メッセージを手動で送信するには、APEX_MAIL.SEND
プロシージャを使用します。
APEX_MAIL_QUEUE
に格納されたメール・メッセージを配信するには、APEX_MAIL.PUSH_QUEUE
を使用します。
Oracle Application Expressでは、未送信の電子メール・メッセージは、APEX_MAIL_QUEUE
という表に格納されます。 プロシージャAPEX_MAIL.PUSH_QUEUE
をコールすることによって、このキューに格納されたメール・メッセージを指定したSMTPゲートウェイに配信できます。
Oracle Application Expressによって、正常に送信されたメッセージのログが、サーバーのローカル時間でのタイムスタンプとともにAPEX_MAIL_LOG
に作成されます。
次のUNIX/Linuxの例では、シェル・スクリプトを使用したAPEX_MAIL.PUSH_QUEUE
プロシージャの使用方法を示します。
SQLPLUS / <<EOF APEX_MAIL.PUSH_QUEUE; DISCONNECT EXIT EOF
コレクションを使用すると、1つ以上の非スカラー値を一時的に取得できます。 コレクションを使用して、現在セッション・ステートにある行および列を格納します。これによって、あるユーザーの特定のセッション中にそれらの行および列に対してアクセス、操作または処理を行うことができます。 コレクションは、情報の行を一時的に格納および指定できるバケツのようなものと考えることができます。
コレクションを使用する場合の例を次に示します。
データ入力ウィザードを作成しており、そのウィザードで、まず論理トランザクション中に複数行の情報を収集する必要がある場合。 物理トランザクションと論理トランザクションの両方の完了時、ウィザードの最終ステップを実行する前に、コレクションを使用して、複数行の情報のコンテンツを一時的に格納できます。
アプリケーションに、ユーザーが1つのページで複数の詳細行を更新する更新ページが含まれている場合。 ユーザーは、複数の更新を行い、それらの更新をコレクションに適用した後、最終プロセスをコールしてそれらの変更をデータベースに適用できます。
任意の数の属性を収集するウィザードを構築している場合。 コレクションに一時的に格納された情報が取得され、データベースに適用されるタスクをウィザードの最後にユーザーが実行するようにします。
このセクションの内容は次のとおりです。
各コレクションには、データ要素(メンバー)の名前付きリストが含まれます。このリストには、最大50個の属性(列)を含めることができます。 PL/SQL API APEX_COLLECTION
を使用して、コレクション情報を挿入、更新および削除します。
各コレクションには、データ要素(メンバー)の名前付きリストが含まれます。このリストには、最大50個の属性(列)を含めることができます。 コレクションを作成するには、次のメソッドを使用します。
CREATE_COLLECTION
CREATE_OR_TRUNCATE_COLLECTION
CREATE_COLLECTION_FROM_QUERY
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B
CREATE_COLLECTION
メソッドでは、指定したコレクションがすでに存在する場合は例外が発生します。次に例を示します。
APEX_COLLECTION.CREATE_COLLECTION( p_collection_name => collection name );
CREATE_OR_TRUNCATE_COLLECTION
メソッドでは、指定したコレクションが存在しない場合に、新しいコレクションが作成されます。 指定したコレクションが存在する場合は、そのコレクションが切り捨てられます。 切り捨てられたコレクションは空になりますが、コレクション自体はそのまま残ります。次に例を示します。
APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION( p_collection_name => collection name, p_generate_md5 => YES or NO );
CREATE_COLLECTION_FROM_QUERY
メソッドでは、コレクションが作成され、指定した問合せの結果がそのコレクションに移入されます。次に例を示します。
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY( p_collection_name => collection name, p_query => your query ); p_generate_md5 => YES or NO );
また、CREATE_COLLECTION_FROM_QUERY_B
メソッドでも、コレクションが作成され、指定した問合せの結果がそのコレクションに移入されます。次に例を示します。
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B( p_collection_name => collection name, p_query => your query );
CREATE_COLLECTION_FROM_QUERY_B
メソッドでは、バルクSQL操作を実行することにより、CREATE_COLLECTION_FROM_QUERY
メソッドよりも非常に速いパフォーマンスが提供されますが、次の制限があります。
問合せの選択リスト内の列値は、2,000バイトを超えることはできません。 列値が2,000バイトを超える行がある場合は、実行中にエラーが発生します。
コレクション内のいずれのメンバーに対してもMD5チェックサムは計算されません。
コレクションの切捨てでは、指定したコレクションからすべてのメンバーが削除されますが、そのコレクション自体はそのまま残ります。次に例を示します。
APEX_COLLECTION.TRUNCATE_COLLECTION( p_collection_name => collection name );
コレクションのメンバーへのアクセスは、データベース・ビューAPEX_COLLECTIONS
への問合せによって行うことができます。 APEX_COLLECTIONS
ビューは次のように定義されています。
COLLECTION_NAME NOT NULL VARCHAR2(255) SEQ_ID NOT NULL NUMBER C001 VARCHAR2(4000) C002 VARCHAR2(4000) C003 VARCHAR2(4000) C004 VARCHAR2(4000) C005 VARCHAR2(4000) ... C050 VARCHAR2(4000) CLOB001 CLOB MD5_ORIGINAL VARCHAR2(4000)
アプリケーション内のAPEX_COLLECTIONS
ビューは、アプリケーション内の他の表またはビューと同様に使用します。次に例を示します。
SELECT c001, c002, c003 FROM APEX_collections WHERE collection_name = 'FIREARMS'
コレクションの削除では、コレクションとそのすべてのメンバーが削除されます。次に例を示します。
APEX_COLLECTION.DELETE_COLLECTION ( p_collection_name => collection name );
自分でコレクションを削除しなくても、セッションの消去時にコレクションが削除されることに注意してください。 次に例を示します。
コレクションに追加したデータ要素(メンバー)には、一意の順序番号が割り当てられます。メンバーをコレクションに追加すると、最も新しいメンバーが一番大きい番号を持つように、前のメンバーより1大きい番号が新しいメンバーに割り当てられます。
コレクションに新しいメンバーを追加するには、ADD_MEMBER
ファンクションを使用します。 このファンクションをコールすると、新しく追加したメンバーの順序番号が戻されます。 次の例では、ADD_MEMBER
ファンクションを使用する方法を示します。
APEX_COLLECTION.ADD_MEMBER( p_collection_name => collection name, p_c001 => [member attribute 1], p_c002 => [member attribute 2], p_c003 => [member attribute 3], p_c004 => [member attribute 4], p_c005 => [member attribute 5], p_c006 => [member attribute 6], p_c007 => [member attribute 7], ... p_c050 => [member attribute 50]); p_clob001 => [CLOB member attribute 1], p_generate_md5 => YES or NO);
ADD_MEMBERS
メソッドを使用して、コレクションに新しいメンバー(またはメンバーの配列)を追加することもできます。次に例を示します。
APEX_COLLECTION.ADD_MEMBERS( p_collection_name => collection name, p_c001 => member attribute array 1, p_c002 => member attribute array 2, p_c003 => member attribute array 3, p_c004 => member attribute array 4, p_c005 => member attribute array 5, p_c006 => member attribute array 6, p_c007 => member attribute array 7, ... p_c050 => member attribute array 50); p_generate_md5 => YES or NO);
このメソッドでは、指定したカレント・ユーザー名を持つコレクションが同じセッションに存在しない場合は、エラーが発生します。 また、4,000文字を超える属性は、4,000文字に切り捨てられます。 追加されるメンバーの数は、1番目の配列内の要素数に基づきます。
コレクション・メンバーを更新するには、UPDATE_MEMBER
プロシージャをコールして、更新するコレクション・メンバーを順序番号を使用して参照します。次に例を示します。
APEX_COLLECTION.UPDATE_MEMBER ( p_collection_name => collection name, p_seq => member sequence number, p_c001 => member attribute 1, p_c002 => member attribute 2, p_c003 => member attribute 3, p_c004 => member attribute 4, p_c005 => member attribute 5, p_c006 => member attribute 6, p_c007 => member attribute 7, ... p_c050 => member attribute 50); p_clob001 => [CLOB member attribute 1],
UPDATE_MEMBER
プロシージャによって、メンバーの個々の属性でなく1つのコレクション・メンバー全体が置換されます。 このプロシージャでは、指定したコレクションが存在しない場合はエラーが発生します。 次に例を示します。
4,000文字を超えるコレクション・メンバー属性には、p_clob001
パラメータを使用します。
コレクション・メンバーの1つの属性を更新するには、UPDATE_MEMBER_ATTRIBUTE
プロシージャを使用します。次に例を示します。
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE( p_collection_name => collection_name, p_seq => member sequence number, p_attr_number => member attribute number, p_attr_value => member attribute value )
APEX_COLLECTION.UPDATE_MEMBER_ATTRIBUTE( p_collection_name => collection_name, p_seq => member sequence number, p_clob_number => CLOB member attribute number, p_clob_value => CLOB member attribute value );
UPDATE_MEMBER_ATTRIBUTE
プロシージャのコールでは、指定したコレクションが存在しない場合はエラーが発生します。
p_clob_number
パラメータの有効値は1のみであることに注意してください。
コレクション・メンバーを削除するには、DELETE_MEMBER
プロシージャをコールして、削除するコレクション・メンバーを順序番号を使用して参照します。次に例を示します。
APEX_COLLECTION.DELETE_MEMBER( p_collection_name => collection name, p_seq => member sequence number);
このプロシージャを使用すると、指定したコレクション内の順序番号が欠落することに注意してください。 また、このプロシージャのコールでは、指定したコレクションが存在しない場合はエラーが発生します。
属性が特定の値に一致するまで、コレクションからすべてのメンバーを削除することもできます。次に例を示します。
APEX_COLLECTION.DELETE_MEMBERS( p_collection_name => collection name, p_attr_number => number of attribute used to match for the specified attribute value for deletion, p_attr_value => attribute value of the member attribute used to match for deletion);
DELETE_MEMBER
プロシージャを使用すると、指定したコレクション内の順序番号も欠落することに注意してください。 このプロシージャでは、次の場合にエラーが発生します。
指定したコレクションが存在しない場合
指定した属性番号が1から50の範囲外であるか、無効である場合
指定した属性値がNULLの場合、指定したコレクションのすべてのメンバーが削除されます。
p_generate_md5
パラメータは、コレクションの各メンバーに対してMD5メッセージ・ダイジェストを計算するかどうかを判別します。 コレクションの作成直後、コレクション・ステータス・フラグはFALSE
に設定されます。 コレクションに対して操作(追加、更新、切捨てなど)が行われると、このフラグはTRUE
に設定されます。
このフラグは、RESET_COLLECTION_CHANGED
をコールすることで、手動でリセットできます。次に例を示します。
APEX_COLLECTION.RESET_COLLECTION_CHANGED ( p_collection_name => collection name)
このフラグをリセットした後にコレクションが変更されたかどうかを判別するには、COLLECTION_HAS_CHANGED
をコールします。次に例を示します。
l_changed := APEX_COLLECTION.COLLECTION_HAS_CHANGED( p_collection_name => collection_name);
p_generated_md5
パラメータがYES
に設定されている場合、コレクションに新しいメンバーを追加すると、50個のすべての属性とCLOB属性に対してMD5メッセージ・ダイジェストが計算されます。 この値はAPEX_COLLECTION
ビューのMD5_ORIGINAL
列からアクセスできます。 指定したコレクション・メンバーの現在の値のMD5メッセージ・ダイジェストにアクセスするには、ファンクションGET_MEMBER_MD5
を使用します。 次に例を示します。
APEX_COLLECTION.GET_MEMBER_MD5 ( p_collection_name => collection name, p_seq => member sequence number ); RETURN VARCHAR2;
コレクションのメンバーを、配列の集合として渡した値とマージできます。 p_init_query
引数を使用することで、指定した問合せからコレクションを作成できます。次に例を示します。
APEX_COLLECTION.MERGE_MEMBERS p_collection_name => collection_name
コレクションが存在する場合、次の操作が実行されることに注意してください。
コレクション(配列ではない)内の行が削除されます。
コレクションおよび配列内の行が更新されます。
配列内に存在し、コレクション内に存在しない行が挿入されます。
4,000文字を超える属性は、4,000文字に切り捨てられます。 表13-1に、コレクションのマージに使用可能な引数を示します。
表13-1 コレクションのマージに使用可能な引数
引数 | 説明 |
---|---|
|
マージされる1番目の属性値の配列です。 最大長は4,000文字です。 最大長より大きい値は4,000文字に切り捨てられます。 P_C001 PL/SQL表内の要素数は、すべてのPL/SQL表内のアイテムの合計数として使用されます。 たとえば、P_C001.count = 2およびP_C002.count = 10の場合、2つのメンバーのみがマージされます。 P_C001がNULLの場合は、アプリケーション・エラーが発生することに注意してください。 |
|
マージされる |
|
コレクションの名前です。 参照: 「コレクションの名前の指定」 |
|
マージ・ファンクションで無視する行を識別するために使用します。 この引数は、行をNULLとして識別します。 NULL行は、コレクションから自動的に削除されます。 |
|
|
|
コレクションが存在しない場合に、この引数によって定義した問合せを使用してコレクションを作成できます。 |
コレクションの管理には、次のユーティリティを使用できます。
このセクションの内容は次のとおりです。
コレクション内のすべてのメンバーの合計数を戻すには、COLLECTION_MEMBER_COUNT
を使用します。 この数は、コレクション内の順序番号の最大値ではないことに注意してください。次に例を示します。
l_count := APEX_COLLECTION.COLLECTION_MEMBER_COUNT ( p_collection_name => collection name );
要素の順序を保持したままで、コレクションを再順序付けして順序番号の欠落を排除するには、RESEQUENCE_COLLECTION
を使用します。次に例を示します。
APEX_COLLECTION.RESEQUENCE_COLLECTION ( p_collection_name => collection name )
コレクションが存在するかどうかを確認するには、COLLECTION_EXISTS
を使用します。次に例を示します。
l_exists := APEX_COLLECTION.COLLECTION_EXISTS ( p_collection_name => collection name );
順序番号を上下に移動させることで、コレクション内の特定のメンバーの順序番号を調整できます。 順序番号を調整すると、指定した番号が別の番号と入れ替えられます。 たとえば、番号2を1つ上に移動すると、2が3になり、3が2になります。
メンバーの順序番号を1つ上に移動するには、MOVE_MEMBER_UP
を使用します。 メンバーの順序番号を1つ下に移動するには、MOVE_MEMBER_DOWN
を使用します。次に例を示します。
APEX_COLLECTION.MOVE_MEMBER_DOWN( p_collection_name => collection name, p_seq => member sequence number);
これらのいずれかのメソッドの使用中は、次の場合にアプリケーション・エラーが表示されます。
指定したコレクションが、カレント・ユーザーのカレント・セッションに存在しない場合
順序番号p_seq
で指定したメンバーが存在しない場合
ただし、指定したメンバーにコレクション内で最も大きい番号または最も小さい番号(MOVE_MEMBER_UP
またはMOVE_MEMBER_DOWN
のどちらをコールするかによる)が割り当てられている場合、アプリケーション・エラーは戻されません。
コレクションのセッション・ステートを消去すると、コレクション・メンバーが削除されます。 コレクションのセッション・ステートの消去が必要な場合の例には、ショッピング・カートがあります。 ショッピング・カートを空にして最初からやり直すリクエストをユーザーから受信したときは、コレクションのセッション・ステートを消去する必要があります。 コレクションのセッション・ステートを削除するには、CREATE_OR_TRUNCATE_COLLECTION
メソッドをコールするか、またはf?p
構文を使用します。
CREATE_OR_TRUNCATE_COLLECTION
メソッドをコールすると、既存のコレクションが削除され、そのコレクションが再作成されます。次に例を示します。
APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION( p_collection_name => collection name,
f?p
構文の6つ目の引数を使用してセッション・ステートを消去することもできます。次に例を示します。
f?p=App:Page:Session::NO:1,2,3,collection name
APEX_ACTIVITY_LOG
ビューには、開発者アクティビティ、アプリケーション実行時アクティビティなどの作業領域内のすべてのアクティビティが記録されます。 APEX_ACTIVITY_LOG
ビューを使用して、現行の作業領域のすべてのアクティビティを問い合せることができます。 たとえば、このビューを使用すると、特定のアプリケーション内の監視レポートを開発し、リアルタイムのパフォーマンス統計を提供できます。
表13-2に、APEX_ACTIVITY_LOG
ビューの列を示します。
表13-2 APEX_ACTIVITY_LOGの列
列 | タイプ | 説明 |
---|---|---|
|
DATE |
アクティビティがページ・ビューの末尾に記録された日時 |
|
VARCHAR2(255) |
今後の使用のための予約 |
|
VARCHAR2(255) |
今後の使用のための予約 |
|
VARCHAR2(4000) |
ページのタイトル |
|
VARCHAR2(4000) |
今後の使用のための予約 |
|
NUMBER |
ページ・ビューの経過時間(秒) |
|
NUMBER |
ページ上で処理された行数 |
|
VARCHAR2(255) |
ページ・ビューを実行しているユーザーのID |
|
VARCHAR2(4000) |
クライアントのIPアドレス |
|
VARCHAR2(4000) |
クライアントのWebブラウザ・ユーザー・エージェント |
|
NUMBER |
アプリケーションID |
|
NUMBER |
ページ番号 |
|
NUMBER |
Oracle Application Expressセッション識別子 |
アクティビティ・ログの領域を節約するため、一意のセッションそれぞれの最初のログ・エントリにのみIPアドレスとWebブラウザ・ユーザー・エージェントが含まれます。
次に、アプリケーション9529に関する過去24時間のページ・ビュー合計数および平均ページ・ビュー時間がユーザーID別に表示されるレポートを作成する方法の例を示します。
SELECT COUNT(*), AVG(elap), userid FROM APEX_ACTIVITY_LOG WHERE time_stamp > (SYSDATE-1) AND flow_id = 9529 GROUP BY userid
Application Expressインスタンスのアクティビティのロギングは2つの異なるログ表間で交互に行われることに注意してください。 このため、ロギング情報がどの程度新しいかは、そのログ内で最も古い使用可能なエントリと同等といえます。 アプリケーション固有のログ情報を長期間保持する場合は、ログの情報を自分のアプリケーション表にコピーするか、ご使用のアプリケーションに直接ロギングを実装します。
APEX_PLSQL_JOB
パッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。 操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。
このセクションの内容は次のとおりです。
APEX_PLSQL_JOB
は、Oracleデータベースで提供されるDBMS_JOB
機能をラップしたラッパー・パッケージです。 APEX_PLSQL_JOB
パッケージでは、PL/SQLをバックグラウンドで実行するために必要な機能のみが公開されることに注意してください。 APEX_PLSQL_JOB
パッケージの記述を次に示します。
SQL> DESC APEX_PLSQL_JOB FUNCTION JOBS_ARE_ENABLED RETURNS BOOLEAN PROCEDURE PURGE_PROCESS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN FUNCTION SUBMIT_PROCESS RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_SQL VARCHAR2 IN P_WHEN VARCHAR2 IN DEFAULT P_STATUS VARCHAR2 IN DEFAULT FUNCTION TIME_ELAPSED RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN PROCEDURE UPDATE_JOB_STATUS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN P_STATUS VARCHAR2 IN P_DESC
表13-3に、APEX_PLSQL_JOB
パッケージで使用可能なファンクションを示します。
表13-3 APEX_PLSQL_JOBパッケージで使用可能なファンクション
ファンクションまたはプロシージャ | 説明 |
---|---|
|
このプロシージャを使用すると、バックグラウンドPL/SQLを送信できます。 このプロシージャは、一意のジョブ番号を戻します。 このジョブ番号は、このパッケージ内の他のプロシージャおよびファンクションの参照点として使用できるため、自分のスキーマ内に格納しておくと役に立ちます。 |
|
このプロシージャをコールすると、現在実行しているジョブのステータスを更新できます。 このプロシージャは、送信されたPL/SQLからコールされたときに最も有効です。 |
|
このファンクションを使用すると、ジョブが送信されてから経過した時間を確認できます。 |
|
このファンクションをコールすると、そのデータベースが現在、 |
|
このプロシージャをコールすると、送信されたジョブをクリーンアップできます。 送信されたジョブは、Oracle Application Expressによってそれらのレコードがクリーンアップされるか、または |
APEX_PLSQL_JOB
パッケージに送信したすべてのジョブは、APEX_PLSQL_JOBS
ビューで表示できます。 APEX_PLSQL_JOBS
ビューの記述を次に示します。
SQL> DESCRIBE APEX_PLSQL_JOBS Name Null? Type --------------------------------- -------- ---------------------------- ID NUMBER JOB NUMBER FLOW_ID NUMBER OWNER VARCHAR2(30) ENDUSER VARCHAR2(30) CREATED DATE MODIFIED DATE STATUS VARCHAR2(100) SYSTEM_STATUS VARCHAR2(4000) SYSTEM_MODIFIED DATE SECURITY_GROUP_ID NUMBER
表13-4に、APEX_PLSQL_JOBS
ビューで使用可能な列を示します。
表 13-4 APEX_PLSQL_JOBSビューの列
名前 | 説明 |
---|---|
|
各行の一意の識別子です。 |
|
送信された各PL/SQLジョブに割り当てられたジョブ番号です。 この値を戻すには、 |
|
このジョブの送信元のアプリケーションです。 |
|
アプリケーションを所有するデータベース・スキーマです。 この値は、 |
|
このプロセスを送信させたエンド・ユーザー(アプリケーションにログインしたユーザー)です。 |
|
ジョブが送信された日付です。 |
|
ステータスが変更された日付です。 |
|
このジョブに対してユーザーが定義したステータスです。 この列を更新するには、 |
|
このジョブに対してシステムが定義したステータスです。 |
|
システム・ステータスが変更された日付です。 |
|
作業領域に割り当てられた一意のIDです。 開発者は、自分の作業領域から送信されたジョブのみを参照できます。 |
送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。
SUBMITTEDは、ジョブが送信済であるが、開始されていないことを示します。 DBMS_JOBでは、ジョブの即時開始は保証されていません。
IN PROGRESSは、DBMS_JOB
がプロセスを開始したことを示します。
COMPLETEDは、ジョブが完了したことを示します。
BROKEN (sqlcode) sqlerrmは、ジョブに問題があり、エラーが発生したことを示します。 エラーが発生したことを示すSQLコードおよびSQLエラー・メッセージがシステム・ステータスに表示されます。 この情報を参照して、エラーの原因を判別してください。
APEX_PLSQL_JOB
パッケージを実装する最も簡単な方法は、PLSQL DBMS JOB
プロセス・タイプを指定するページ・プロセスを作成することです。 このプロセス・タイプを選択すると、ジョブとして指定したPL/SQLコードがアプリケーション・ビルダーによって送信されます。 ファンクションを直接コールしないため、組込み置換アイテムであるAPP_JOB
を使用して、送信する任意のジョブのジョブ番号を指定できます。
テストおよび説明用に、PL/SQLジョブをバックグラウンドで実行する例を次に示します。
001 BEGIN 002 FOR i IN 1 .. 100 LOOP 003 INSERT INTO emp(a,b) VALUES (:APP_JOB,i); 004 IF MOD(i,10) = 0 THEN 005 APEX_PLSQL_JOB.UPDATE_JOB_STATUS( 006 P_JOB => :APP_JOB, 007 P_STATUS => i || 'rows inserted'); 008 END IF; 009 APEX_UTIL.PAUSE(2); 010 END LOOP; 011 END;
この例の説明を次に示します。
002から010行では、100個のレコードをemp
表に挿入するループを実行します。
APP_JOB
は、INSERTのVALUE句内でバインド変数として参照され、UPDATE_JOB_STATUS
へのコール内でP_JOB
パラメータの値として指定されます。
APP_JOB
は、APEX_PLSQL_JOB
に送信される際に、このプロセスに割り当てられるジョブ番号を表します。 プロセス・コード内にこの予約アイテムを指定すると、実行時に実際のジョブ番号に自動的に置換されます。
この例では、コード・ブロック内で、10個のレコードごとにUPDATE_JOB_STATUS
がコールされることに注意してください。 通常、Oracleトランザクション規則では、コード・ブロック内で実行された更新は、トランザクション全体がコミットされるまで表示されません。 一方、APEX_PLSQL_JOB.UPDATE_JOB_STATUS
プロシージャは、ジョブが成功したか失敗したかにかかわらず更新を実行するように実装されています。 このことは、次の2つの理由から重要です。
ステータスが「100行が挿入されました。」の場合でも、操作全体が成功したわけではありません。 コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、APEX_PLSQL_JOBS
のuser_status
列は影響を受けません。
更新は自律的に実行されます。 ジョブが完了する前にジョブ・ステータスを表示できます。 これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。
Webサービスを使用すると、プラットフォームおよび言語に依存しない環境で、Webを介したアプリケーション間の通信が可能になります。 通常のWebサービス・シナリオでは、ビジネス・アプリケーションが、HTTPプロトコルを使用して、特定のURLにあるサービスに対してリクエストを送信します。 サービスはリクエストを受信し、処理してからレスポンスを返します。 外部Webサービスへのコールをアプリケーション・ビルダーで開発されたアプリケーションに組み込むことができます。
Webサービスは、Simple Object Access Protocol(SOAP)に基づいています。 SOAPは、World Wide Web Consortium(W3C)が策定した、インターネットを介したリクエストとレスポンスの送受信用の標準プロトコルです。 SOAPメッセージは、サービス・プロバイダとサービス・ユーザー間でSOAPエンベロープに入れて送受信できます。
SOAPには、主に2つのメリットがあります。
SOAPはXMLをベースとしており、使用方法も容易です。
このプロトコルではHTTPなどの単純な転送プロトコルが使用されているため、SOAPメッセージはファイアウォールでブロックされることはありません。
このセクションの内容は次のとおりです。
注意: SOAP 1.1仕様はW3C覚書です。 (SOAPより優先される標準を作成するために、W3C XML Protocol Working Groupが結成されています。)Simple Object Access Protocol(SOAP)1.1の詳細は、次のWebサイトを参照してください。 http://www.w3.org/TR/SOAP/ |
Oracle Application ExpressでWebサービスを使用するには、ウィザードを使用してWebサービス参照を作成します。 各Webサービス参照は、ターゲットWebサービスを説明するWeb Services Description Language(WSDL)ドキュメントをベースにしています。 Webサービス参照を作成する場合、ウィザードはWSDLを分析して必要な情報をすべて収集し、有効なSOAPメッセージを作成します。必要な情報は、次のとおりです。
HTTPを介したSOAPリクエストのポストに使用するURL
SOAP HTTPリクエストを識別するUniversal Resource Identifier(URI)
Webサービスの操作
各操作の入力パラメータ
各操作の出力パラメータ
Webサービス参照は、「Webサービス参照」ページで管理します。
「Webサービス参照」ページにアクセスするには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
「共有コンポーネント」ページが表示されます。
「ロジック」で、「Webサービス参照」を選択します。
「Webサービス参照」ページが表示されます。
インターネットのアクセスにプロキシ・サーバーが必要な環境の場合は、Webサービス参照を作成する前に「アプリケーション属性」ページでプロキシ・サーバー・アドレスを指定する必要があります。
アプリケーションにプロキシ・アドレスを指定するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「属性の編集」をクリックします。
「定義」をクリックします。
「名前」で、「プロキシ・サーバー」にプロキシ・サーバーを入力します。
「変更の適用」をクリックします。
Webサービス参照を作成する場合、WSDLの位置の特定方法を決定する必要があります。 WSDLの位置の特定には、2つの方法があります。
UDDIレジストリは、ビジネスのWebサービスを登録するディレクトリです。
UDDIレジストリを検索して、新しいWebサービスを作成するには、次のステップを実行します。
「Webサービス参照」ページにナビゲートします。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
「共有コンポーネント」をクリックします。
「ロジック」で、「Webサービス参照」を選択します。
「Webサービス参照」ページが表示されます。
「作成」をクリックします。
WSDLを検出するためにUDDIレジストリを検索するかどうかを尋ねるプロンプトが表示されたら、「はい」をクリックします。
「UDDIの位置」では、次のいずれかを実行できます。
UDDIレジストリへのURLエンドポイントを入力する。
「リスト」 アイコンをクリックして、UDDIレジストリを選択する。
「サービスを検索」で、ビジネス名またはサービス名のどちらを検索するかを指定します。
「検索タイプ」で、ビジネス名またはサービス名のどちらを検索するかを指定します。 両方を検索することはできません。
「名前」に、検索するビジネス名またはサービス名を入力します。
オプションで、検索で大文字と小文字を区別するか、または完全一致させるかを指定します。 ワイルドカード文字としてパーセント記号(%)を使用します。
「検索」をクリックします。
検索結果が表示されたら、選択した後で「次へ」をクリックします。
選択したWebサービスについて説明するサマリー・ページが表示されます。
選択内容を確認し、「次へ」をクリックして続行します。
WSDLドキュメントへのURLが「WSDLの位置」フィールドに表示されます。
「終了」をクリックします。
Webサービス参照がWebサービス参照リポジトリに追加されます。
特定のWSDLドキュメントへのURLを指定して、新しいWebサービスを作成するには、次のステップを実行します。
「Webサービス参照」ページにナビゲートします。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
「共有コンポーネント」をクリックします。
「ロジック」で、「Webサービス参照」を選択します。
「Webサービス参照」ページが表示されます。
「作成」をクリックします。
WSDLを検出するためにUDDIレジストリを検索するかどうかを尋ねるプロンプトが表示されたら、「いいえ」をクリックします。
「WSDLの位置」に、WSDLドキュメントへのURLを入力します。
「終了」をクリックします。
Webサービス参照がWebサービス参照リポジトリに追加されます。
Webサービス参照がWebサービス参照リポジトリに格納されます。
Webサービス参照リポジトリにアクセスするには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
「共有コンポーネント」ページが表示されます。
「ロジック」で、「Webサービス参照」を選択します。
「Webサービス参照」ページが表示されます。
「ビュー」リストから選択して、ページの外観を変更できます。 使用可能なオプションは次のとおりです。
アイコン(デフォルト): 各Webサービス参照を大きいアイコンとして表示します。 Webサービス参照を編集するには、該当するアイコンをクリックします。
詳細: 各アプリケーション・アイテムをレポートに1行で表示します。
「詳細」ビューでは、次の操作を実行できます。
「編集」アイコンをクリックして参照を編集します。
「実行」アイコンをクリックして参照をテストします。
参照名をクリックして、参照の詳細を表示します。
Webサービス参照を作成した後、「Webサービス参照のテスト」ページでテストできます。
Webサービス参照をテストするには、次のステップを実行します。
「Webサービス参照」ページにナビゲートします。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
「共有コンポーネント」をクリックします。
「ロジック」で、「Webサービス参照」を選択します。
「Webサービス参照」ページが表示されます。
「ビュー」から、「詳細」を選択します。
Webサービス参照名の横にある「 実行 」アイコンをクリックします。
「Webサービス参照のテスト」ページが表示されます。 ページ上部に、Webサービス名とURLエンドポイントが表示されます。
「操作」から、実行する操作を選択します。
「入力パラメータ」で、適切な値を入力します。
「テスト」をクリックします。
ページの下部に、メッセージ・リクエストとレスポンスが表示されます。
「Webサービスのフォームとレポートの作成」ウィザードでは、入力フォーム、送信ボタンおよび結果を表示するレポートが作成されます。 Webサービス参照を作成した直後、または新しいページを追加して、このウィザードを実行できます。
このウィザードは、Webサービスの結果が非スカラーであることが予想される場合に使用します。 Amazon社のWebサービスが良い例です。 このWebサービスでは、入力フォームに入力された検索基準に基づいて多くの結果が戻されます。
Webサービス参照を作成した後に、フォームとレポートを作成するには、次のステップを実行します。
Webサービス参照を作成します。 詳細は、「Webサービス参照の作成」を参照してください。
Webサービス参照が追加された後で、「Webサービスのフォームとレポートの作成」を選択します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。 指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
フォームに追加するアイテムを指定します。 アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「ベース・ノード」で、次の操作を実行します。
「一時結果セット名」に、Webサービスの結果を格納するコレクションの名前を入力します。
「レポート対象の結果ツリー」で、作成されるXML文書(レポートに含める情報を含む)の一部を選択します。
「表示する結果パラメータ」で、レポートに含めるパラメータを選択します。
「終了」をクリックします。
既存のWebサービス参照がある場合は、新しいページを追加して、入力フォームとレポートを作成できます。
新しいページを追加して、フォームとレポートを作成するには、次のステップを実行します。
Webサービス参照を作成します。 詳細は、「Webサービス参照の作成」を参照してください。
新しいページを作成します。 詳細は、「ページのアプリケーションへの追加」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「フォーム」を選択します。
「Webサービスのフォームとレポート」を選択します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。 指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
フォームに追加するアイテムを指定します。 アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「ベース・ノード」で、次の操作を実行します。
「一時結果セット名」に、Webサービスの結果を格納するコレクションの名前を入力します。
「レポート対象の結果ツリー」で、作成されるXML文書(レポートに含める情報を含む)の一部を選択します。
「表示する結果パラメータ」で、レポートに含めるパラメータを選択します。
「終了」をクリックします。
「Webサービスのフォームの作成」ウィザードでは、フォームと送信ボタンが作成されます。 Webサービス参照を作成した後、または「ページ定義」から、このウィザードを実行できます。
このウィザードは、Webサービスの結果がスカラーであることが予想される場合に使用します。 株価を調べるWebサービスが良い例です。入力は銘柄記号で、出力はスカラーの適正価格であるためです。
Webサービス参照を作成した後に、フォームを作成するには、次のステップを実行します。
Webサービス参照を作成します。 詳細は、「Webサービス参照の作成」を参照してください。
Webサービス参照が追加された後で、「Webサービスのフォームの作成」を選択します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。 指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「出力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。 アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「終了」をクリックします。
既存のWebサービス参照がある場合は、新しいページを追加して、フォームを作成できます。
新しいページを追加して、フォームを作成するには、次のステップを実行します。
Webサービス参照を作成します。 詳細は、「Webサービス参照の作成」を参照してください。
新しいページを作成します。 詳細は、「ページのアプリケーションへの追加」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「フォーム」を選択します。
「Webサービスのフォーム」を選択します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。 指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。 アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「出力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。 アイテムを含めるには、「作成」列で「はい」を選択します。 アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「終了」をクリックします。
ページ上で、Webサービスをプロセスとして実装することもできます。 このプロセスを実行すると、リクエストがサービス・プロバイダに送信されます。 その後で、レポートにリクエスト結果を表示できます。
Webサービスをプロセスとして起動するには、次のステップを実行します。
新しいページを作成します。 詳細は、「ページのアプリケーションへの追加」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「空白ページ」を選択します。
タブを使用するかどうかを尋ねるプロンプトが表示されたら、「いいえ」を選択します。
「ページ定義」にナビゲートします。
「作業領域」ホームページにナビゲートします。
「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
ページを選択します。
「ページ定義」が表示されます。
「ページ・レンダリング」の「プロセス」で、「作成」アイコンをクリックします。
プロセスのカテゴリから、「Webサービス」を選択します。
プロセス名、順序およびプロセス・ポイントを指定します。
Webサービス参照および実行する操作を選択します。
プロセスを定義します。 「Webサービスの出力パラメータ」でオプションを選択すると、結果をコレクションまたはページ上のアイテムに格納できます。
コレクションに結果を格納するには、次のステップを実行します。
「結果の格納場所」で、「コレクション」を選択します。
「値」フィールドにコレクションの名前を入力します。
ページ上のアイテムに結果を格納するには、次のステップを実行します。
「結果の格納場所」で、「アイテム」を選択します。
表示されるフィールドに該当するアイテムの値を入力します。
「プロセスの作成」をクリックします。
Webサービスのリクエスト結果を表示するレポートを作成するには、次のステップを実行します。
「ページ定義」にナビゲートします。
「作業領域」ホームページにナビゲートします。
「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
ページを選択します。
「ページ定義」が表示されます。
「リージョン」で、「作成」アイコンをクリックします。
「リージョンの作成」ウィザードが表示されます。
「リージョン・タイプ」で、「レポート」を選択します。
「レポート実装」で、「Webサービスの結果を含むコレクションのレポート」を選択します。「リージョン属性を指定」で、リージョン・タイトルを入力し、オプションでリージョン属性を編集します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「レポート対象の結果ツリー」で、作成されるXML文書(レポートに含める情報を含む)の一部を選択します。
「結果パラメータ」で、次の操作を実行します。
「一時結果セット名」に、Webサービスの結果を格納するコレクションの名前を入力します。
該当するパラメータを選択した後、選択解除します。
「SQLレポートの作成」をクリックします。
Webサービス・タイプのプロセスを作成した後で、Webサービス・プロセスを編集すると、入力パラメータを静的な値にマップできます(たとえば、キーを渡すなど)。
Webサービス・プロセスを編集するには、次のステップを実行します。
Webサービス・プロセスを作成します。 詳細は、「プロセスとしてのWebサービスの起動」を参照してください。
Webサービス・プロセスが含まれている「ページ定義」にナビゲートします。
プロセス名を選択します。
「ページ・プロセスの編集」ページが表示されます。
入力パラメータを静的な値にマップするには、次のステップを実行します。
「Webサービスの入力パラメータ」までスクロールします。
該当するパラメータ名の横にある「値」フィールドに値を入力します。
「変更の適用」をクリックします。
「Webサービス履歴」では、カレント・アプリケーションのWebサービス参照の変更が、アプリケーションID、Webサービス参照名、開発者および日付ごとに表示されます。
Webサービス参照の変更履歴を表示するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
「共有コンポーネント」ページが表示されます。
「ロジック」で、「Webサービス参照」を選択します。
「履歴」をクリックします。
注意: 「Webサービス参照」ページに「履歴」ボタンが表示されるのは、Webサービス参照を作成した後のみです。 |