このセクションでは、自動的なデータ操作言語を使用した作業、データベース・リンクの確立、コレクションの使用、バックグラウンドSQLの実行、Webサービスの使用、ユーザー・プリファレンスの管理など、高度なプログラミング手法について説明します。
このセクションの内容は次のとおりです。
自動的なデータ操作言語(DML)が表内の行を更新または削除するためにOracle Application Expressで使用される場合、トランザクションが開始されるとまず行をロックし、ページに表示されてから変更されたかどうかを確認して、最後に行に対するUPDATE
またはDELETE
文を発行します。
行のロックが頻繁に発生する一部の環境では、DML操作を制御してDML操作が次の状態かどうかを判別する場合があります。
無期限に待機
即時に失敗
指定した一定時間待機
アプリケーション置換文字列、アプリケーション・アイテムまたはページ・アイテムの値をAPEX_DML_LOCK_WAIT_TIME
に設定すると、DML操作を制御できます。次の値がサポートされています。
NULLの場合(デフォルト)、Oracle Application Expressの以前のバージョンと同じ動作、つまり、無期限に待機します。
0の場合、他のデータベース・セッションによって行がロックされていると、即時に失敗します。
0以上で行がロックされている場合、指定した秒数間待機します。
アプリケーションで設定する場合、APEX_DML_LOCK_WAIT_TIME
の値はアプリケーション全体の自動DMLを使用するすべてのUPDATE
およびDELETE
DML操作に適用されます。特定の自動DMLプロセスを制御するには、自動DMLプロセスの前にAPEX_DML_LOCK_WAIT_TIME
の値を更新して、自動DMLプロセスの後にリセットします。これは、表形式フォームを使用した更新および削除には影響しないことに注意してください。
アプリケーション置換文字列、アプリケーション・アイテムまたはページ・アイテムの値をFSP_DML_LOCK_ROW
に設定して、DML操作を制御することもできます。次の値がサポートされています。
値をFALSE
に設定すると、SELECT FOR UPDATE
は発行されません。
値がFALSE
以外の場合は、自動DMLを使用してUPDATE
またはDELETE
DML操作を発行すると、SELECT FOR UPDATE
のデフォルトの動作が実行されます。
作業領域のホームページはOracle Database上で実行されるため、ユーザーは、Oracleのすべての分散データベース機能を使用できます。通常、分散データベース操作は、データベース・リンクを使用して実行します。
データベース・リンクは1つのデータベースのスキーマ・オブジェクトであり、これを使用すると、別のデータベース上のオブジェクトにアクセスできます。データベース・リンクを作成すると、表名またはビュー名に@dblink
を追加することによって、リモート・オブジェクトにアクセスできます。この場合のdblink
は、データベース・オブジェクトの作成ウィザードで指定するデータベース・リンク名です。
注意: デフォルトでは、CREATE DATABASE LINKシステム権限は、割り当てられた作業領域またはデータベース・ユーザーに付与されません。この機能を使用するには、DBAまたは管理者が、この特定の権限をユーザーの作業領域のデータベース・ユーザーに付与する必要があります。Oracle Database管理者ガイドの「データベース・リンクの作成」を参照してください。 |
データベース・リンクを作成するには、次のステップを実行します。
作業領域ホームページで、「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。
オブジェクト・ブラウザが表示されます。
「作成」をクリックします。
「データベース・リンク」を選択して、「次へ」をクリックします。
画面に表示されるステップに従います。
データベース・リンク名は、Oracleのネーミング規則に従う必要があり、空白を含めたり、数字やアンダースコアから開始することはできません。
既存のデータベース・リンクを表示するには、次のステップを実行します。
作業領域ホームページで、「SQLワークショップ」をクリックして、「オブジェクト・ブラウザ」をクリックします。
オブジェクト・ブラウザが表示されます。
ページ上部のオブジェクト・タイプ「データベース・リンク」を選択します。
参照: Oracle Application Express SQLワークショップおよびユーティリティ・ガイドの「オブジェクト・ブラウザを使用したデータベース・オブジェクトの管理」およびOracle Database管理者ガイドの「データベース・リンク」 |
このセクションでは、Oracle Application Expressアプリケーションから電子メールを送信する方法を説明します。
このセクションの構成は次のとおりです。
参照: Oracle Application Express管理ガイドの「メールの管理」 |
ヒント: Oracle Database 11g リリース1(11.1)でOracle Application Expressを実行している場合は、外部に電子メールを送信するにはネットワーク・サービスを有効化する必要があります。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。 |
アプリケーション・ビルダー・アプリケーションから電子メールを送信する前に、次のステップを実行する必要があります。
Oracle Application Express管理サービスにログインし、インスタンスの設定ページで電子メール設定を構成します。Oracle Application Express管理ガイドを参照してください。
さらに、Oracle Database 11g リリース1(11.1)でOracle Application Expressを実行している場合、外部へのメールを有効化する必要があります。Oracle Database 11g リリース1(11.1)では、ネットワーク・サービスと通信する機能はデフォルトで無効になっています。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。
ヒント: 新しい作業領域リクエストが承認されたときにユーザーにログイン資格証明が電子メールで自動的に送信されるように、Oracle Application Expressを構成できます。詳細は、Oracle Application Express管理ガイドの「割当てモードの指定」を参照してください。 |
APEX_MAIL
というPL/SQLパッケージをコールすることによって、アプリケーション・ビルダー・アプリケーションから電子メールを送信できます。このパッケージは、Oracleで提供されるUTL_SMTP
パッケージをベースとして構築されています。このような依存性があるため、APEX_MAIL
を使用するには、UTL_SMTP
パッケージがインストール済で機能している必要があります。
参照: UTL_SMTPパッケージの詳細は、Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンスを、「APEX_MAIL」の詳細は、Oracle Application Express APIリファレンスを参照してください。 |
APEX_MAIL
には、電子メールを送信するための次の3つのプロシージャが含まれています。
アプリケーションから外部へ電子メール・メッセージを手動で送信するには、APEX_MAIL.SEND
を使用します。
添付ファイルとしてアプリケーションから外部へ電子メール・メッセージを送信するには、APEX_MAIL.ADD_ATTACHMENT
を使用します。
APEX_MAIL_QUEUE
に格納されたメール・メッセージを配信するには、 APEX_MAIL.PUSH_QUEUE
を使用します。
Oracle Application Expressでは、表の指定したAPEX_MAIL_QUEUE
に、未送信の電子メール・メッセージが格納されます。APEX_MAIL.PUSH_QUEUE
プロシージャをコールすると、このキューに格納されたメール・メッセージを指定したSMTPゲートウェイに配信できます。
Oracle Application Expressによって、正常に送信されたメッセージのログが、サーバーのローカル時間でのタイムスタンプとともにAPEX_MAIL_LOG
表に作成されます。
次に、シェル・スクリプトを使用したAPEX_MAIL.PUSH_QUEUE
プロシージャのUNIXまたはLinux使用例を示します。
SQLPLUS / <<EOF APEX_MAIL.PUSH_QUEUE; DISCONNECT EXIT EOF
参照: Oracle Application Express APIリファレンスの「APEX_MAIL」およびOracle Application Express管理ガイドの「メールの管理」 |
コレクションを使用すると、1つ以上の非スカラー値を一時的に取得できます。コレクションを使用して、現在セッション・ステートにある行および列を格納します。これによって、あるユーザーの特定のセッション中にそれらの行および列に対してアクセス、操作または処理を行うことができます。コレクションは、バケツのようなものと考えることができます。その中に情報の行を一時的に格納し、その情報を指定できます。
次に、コレクションを使用する場合の例を示します。
データ入力ウィザードを作成しており、そのウィザードで、まず論理トランザクション中に複数行の情報を収集する必要がある場合。物理トランザクションと論理トランザクションの両方の完了時、ウィザードの最終ステップを実行する前に、コレクションを使用して、複数行の情報のコンテンツを一時的に格納できます。
アプリケーションに、ユーザーが1つのページで複数の詳細行を更新する更新ページが含まれている場合。ユーザーは、複数の更新を行い、それらの更新をコレクションに適用した後、最終プロセスをコールしてそれらの変更をデータベースに適用できます。
任意の数の属性を収集するウィザードを構築している場合。コレクションに一時的に格納された情報が取得され、データベースに適用されるタスクをウィザードの最後にユーザーが実行するようにします。
このセクションの構成は次のとおりです。
各コレクションには、データ要素(メンバー)の名前付きリストが含まれます。このリストには、最大50個の文字属性(VARCHAR2(4000)
)および1個の大文字属性(CLOB
)を含めることができます。PL/SQL API APEX_COLLECTION
を使用して、コレクション情報を挿入、更新および削除します。
各コレクションには、データ要素(メンバー)の名前付きリストが含まれます。このリストには、最大50個の文字属性(VARCHAR2(4000)
)および1個の大文字属性(CLOB
)を含めることができます。次のメソッドを使用してコレクションを作成します。
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
プロシージャを使用すると、個々のメンバー属性ではなく、コレクション・メンバー全体を置き換えます。指定したコレクションが存在しない場合、このプロシージャによりエラーが発生します。次に例を示します。
4,000文字を超えるコレクション・メンバー属性には、p_clob001
パラメータを使用します。
コレクション・メンバーの単一の属性を更新する場合には、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_CCOLLECTION
ビューのMD5_ORIGINAL
列からアクセスできます。GET_MEMBER_MD5
ファンクションを使用して、指定したコレクション・メンバーの現在の値に対する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文字に切り捨てられます。表15-1に、コレクションのマージに使用可能な引数を示します。
表15-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
使用して、現在の作業領域に関するすべてのアクティビティの問合せを表示できます。たとえば、このビューを使用して、リアルタイムのパフォーマンス分析を提供する特定のアプリケーション内の監視レポートを開発できます。
表15-2に、APEX_ACTIVITY_LOG
ビューの列を示します。
表15-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セッション識別子。 |
|
VARCHAR2(4000) |
SQLエラー・メッセージ |
|
VARCHAR2(255) |
今後の使用のための予約 |
|
VARCHAR2(255) |
今後の使用のための予約 |
アクティビティ・ログの領域を節約するため、一意のセッションそれぞれの最初のログ・エントリにのみ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
Oracle Application Expressインスタンスでのアクティビティのロギングは2つの異なるログ表を順番に使用することに注意してください。このため、ロギング情報はログのうち古い方の使用可能なエントリのみとなります。アプリケーションの特定のログ情報を常に保持する場合は、所有するアプリケーション表に両方のログ情報をコピーするか、アプリケーションに直接ロギングを実装する必要があります。
APEX_PLSQL_JOB
パッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。
このセクションの構成は次のとおりです。
APEX_PLSQL_JOB
は、Oracle Databaseで提供される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
表15-3に、APEX_PLSQL_JOB
パッケージで使用可能なファンクションを示します。
表15-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
表15-4に、APEX_PLSQL_JOBS
ビューで使用可能な列を示します。
表15-4 APEX_PLSQL_JOBSビュー列
名前 | 説明 |
---|---|
|
列ごとに一意の識別子です。 |
|
送信された各PL/SQLジョブに割り当てられたジョブ番号です。この値を戻すには、 |
|
このジョブの送信元のアプリケーションです。 |
|
アプリケーションを所有するデータベース・スキーマです。この値は、 |
|
このプロセスを送信させたエンド・ユーザー(アプリケーションにログインしたユーザー)です。 |
|
ジョブが送信された日付です。 |
|
ステータスが変更された日付です。 |
|
このジョブに対してユーザーが定義したステータスです。この列を更新するには、 |
|
このジョブに対してシステムが定義したステータスです。 |
|
システム・ステータスが変更された日付です。 |
|
作業領域に割り当てられた一意のIDです。開発者は、自分の作業領域から送信されたジョブのみを参照できます。 |
送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。
SUBMITTED: ジョブが送信済であるが、開始されていないことを示します。DBMS_JOBでは、ジョブの即時開始は保証されていません。
IN PROGRESS: DBMS_JOB
がプロセスを開始したことを示します。
COMPLETED: ジョブが完了したことを示します。
BROKEN (sqlcode) sqlerrm: ジョブに問題があり、エラーが発生したことを示します。エラーが発生したことを示すSQLコードおよびSQLエラー・メッセージがシステム・ステータスに表示されます。この情報を参照して、エラーの原因を判別してください。
テストおよび説明用に、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メッセージはファイアウォールでブロックされることはありません。
ヒント: Oracle Application ExpressをOracle Database 11g リリース1(11.1)以上と同時に実行している場合は、Webサービスを使用するためにネットワーク・サービスを有効にする必要があります。「Oracle Database 11gのネットワーク・サービスの有効化」を参照してください。 |
このセクションの構成は次のとおりです。
注意: 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 Services Description Language(WSDL)ドキュメントに基づくか、サービスに関する情報を参照して手動で作成することができます。
WSDLに基づいてWebサービス参照を作成する場合、ウィザードはWSDLを分析し、すべての必要な情報を収集して、次を含んだ有効なSOAPメッセージを作成します。
HTTP(S)を介したSOAPリクエストのポストに使用するURL
SOAP HTTPリクエストを識別するUniversal Resource Identifier(URI)
Webサービスの操作
各操作の入力パラメータ
各操作の出力パラメータ
手動でWebサービス参照を作成する場合、必要な情報を指定して、次を含んだ有効なSOAPリクエストを作成します。
HTTP(S)を介したSOAPリクエストのポストに使用するURL
SOAP HTTPリクエストを識別するUniversal Resource Identifier(URI)
アイテムの置換を含んだリクエストのSOAPエンベロープ
オプションで、Webサービスからのレスポンスを格納するコレクション名
Webサービス参照は、Webサービス参照ページで管理します。
Webサービス参照ページにアクセスするには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
共有コンポーネント・ページが表示されます。
「ロジック」で、「Webサービス参照」をクリックします。
Webサービス参照ページが表示されます。
インターネットのアクセスにプロキシ・サーバーが必要な環境の場合は、Webサービス参照を作成する前にアプリケーション属性ページでプロキシ・サーバー・アドレスを指定する必要があります。
アプリケーションにプロキシ・アドレスを指定するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーションのホームページが表示されます。
「共有コンポーネント」をクリックします。
「アプリケーション」で、「定義」をクリックします。
「名前」で、「プロキシ・サーバー」フィールドにプロキシ・サーバーを入力します。
「変更の適用」をクリックします。
Secure Sockets Layer(SSL)は、RSA公開鍵による暗号化と対称鍵による暗号化を組み合せて、認証、暗号化およびデータの整合性を実現する業界標準プロトコルです。
通信する必要のあるWebサービスがSSL対応の場合(Webサービスに対するURLにhttps
と表示される)、ウォレットを作成する必要があります。ウォレットは、SSLに必要な認証および署名された資格証明(秘密鍵、証明書および信頼できる証明書)の格納に使用されるパスワード保護されたコンテナです。
参照: Oracle Application Express管理ガイドの「ウォレット情報の構成」 |
WSDLに基づいたWebサービス参照を作成する場合、WSDLの位置の特定方法を決定する必要があります。WSDLの位置の特定には、次の2つの方法があります。
UDDIレジストリは企業がWebサービスを登録するディレクトリです。
このセクションの構成は次のとおりです。
UDDIレジストリを検索して、新しいWebサービスを作成するには、次のステップを実行します。
Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。
「作成」をクリックします。
WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「はい」をクリックします。
「UDDIの位置」では、次のいずれかを実行できます。
UDDIレジストリへのURLエンドポイントを入力する。
「リスト」 アイコンをクリックして、UDDIレジストリを選択する。
「検索」で、次を指定します。
検索タイプ: ビジネス名またはサービス名のどちらを検索するかを指定します。両方を検索することはできません。
名前: 検索に使用するビジネス名またはサービス名を入力します。ワイルドカードにはパーセント(%)を使用します。
オプションで、完全一致検索または大文字/小文字を区別する検索を指定できます。
「検索」をクリックします。
検索結果が表示されたら、選択した後で「次へ」をクリックします。
選択したWebサービスについて説明するサマリー・ページが表示されます。
選択内容を確認し、「次へ」をクリックして続行します。
WSDLドキュメントへのURLが「WSDLの位置」フィールドに表示されます。
「終了」をクリックします。
Webサービス参照がWebサービス参照リポジトリに追加されます。
特定のWSDLドキュメントへのURLを指定して、新しいWebサービスを作成するには、次のステップを実行します。
Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。
「作成」をクリックします。
WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「いいえ」をクリックします。
「WSDLの位置」に、WSDLドキュメントへのURLを入力します。
「終了」をクリックします。
Webサービス参照がWebサービス参照リポジトリに追加されます。
新規のWebサービス参照を手動作成するには、次のステップを実行します。
Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。
「作成」をクリックします。
WSDLを検出するためにUDDIレジストリを検索することを確認するプロンプトが表示されたら、「いいえ」をクリックします。
「タスク」リストで、「Webサービス参照の手動作成」をクリックします。
Webサービスの作成/編集ページが表示されます。
「名前」で、参照を識別する名前を入力します。
「サービスの説明」には、次の項目があります。
URL: WebサービスのURLエンドポイントを入力します。
アクション: Webサービスのアクションを入力します(オプション)。
プロキシ: このサービスのアプリケーション・プロキシを上書きする場合、プロキシを入力します。
Basic認証: Webサービスが認証を必要とするかどうかを選択します。「はい」または「いいえ」を選択します。
「SOAPエンベロープ」で、このリクエストのSOAPエンベロープを入力します。
「コレクションにレスポンスを格納」で、レスポンスを格納するコレクション名を入力します(オプション)。
「作成」をクリックします。
Webサービス参照がWebサービス参照リポジトリに追加されます。
Webサービス参照がWebサービス参照リポジトリに格納されます。
Webサービス参照リポジトリにアクセスするには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
共有コンポーネント・ページが表示されます。
「ロジック」で、「Webサービス参照」をクリックします。
Webサービス参照ページが表示されます。
ページ上部の「ナビゲーション」バーを使用して、Webサービス参照の検索またはページ表示の変更を行います。使用可能なオプションは次のとおりです。
Webサービス参照: 参照名に大/小文字を区別しない問合せを入力して、「実行」をクリックします。すべてのWebサービス参照を表示するには、フィールドを空白のままにして「実行」をクリックします。
ビュー: 表示モードを選択して「実行」をクリックします。使用可能なオプションは次のとおりです。
アイコン(デフォルト): 各Webサービス参照を大きいアイコンとして表示します。Webサービス参照を編集するには、該当するアイコンをクリックします。
詳細 : 各Webサービス参照をレポートで1行に表示します。
「ビュー」リストから「詳細」を選択して、「実行」をクリックします。
「詳細」ビューでは、次の操作を実行できます。
参照名をクリックして参照を編集します。
「実行」アイコンをクリックして参照をテストします。
「ビュー」アイコンをクリックして参照に関する詳細を表示します。このオプションは、手動作成されたWebサービス参照には使用できないことに注意してください。
Webサービス参照を作成した後、Webサービス参照のテスト・ページでテストできます。
Webサービス参照をテストするには、次のステップを実行します。
Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。
「ビュー」から、「詳細」を選択します。
Webサービス参照名の横にある「 実行 」アイコンをクリックします。
Webサービス参照のテスト・ページが表示されます。ページの上部に、Webサービス名とURLエンドポイントが表示されます。
「操作」から、実行する操作を選択します。
「入力パラメータ」で、適切な値を入力します。
「テスト」をクリックします。
ページの下部に、メッセージ・リクエストとレスポンスが表示されます。
Webサービス参照を作成した後、Webサービス参照のテスト・ページでテストできます。
Webサービス参照をテストするには、次のステップを実行します。
Webサービス参照ページにナビゲートします。「Webサービス参照ページへのアクセス」を参照してください。
「ビュー」から、「詳細」を選択します。
Webサービス参照名の横にある「 実行 」アイコンをクリックします。
Webサービス参照のテスト・ページが表示されます。ページの上部に、Webサービス名とURLエンドポイントが表示されます。
必要に応じて、「Basic認証」でユーザー名およびパスワードを入力します。
「SOAPエンベロープ」テキスト領域では、オプションで、SOAPリクエスト・エンベロープを編集します。
「テスト」をクリックします。
ページの下部に、メッセージ・リクエストとレスポンスが表示されます。
Webサービスのフォームとレポートの作成ウィザードでは、入力フォーム、送信ボタンおよび結果を表示するレポートが作成されます。WSDLからWebサービス参照を作成した直後、または新しいページを追加して、このウィザードを実行できます。
このウィザードは、Webサービスの結果が非スカラーであることが予想される場合に使用します。Amazon社のWebサービスがよい例です。このWebサービスでは、入力フォームに入力された検索基準に基づいて多くの結果が戻されます。
Webサービス参照を作成した後に、フォームとレポートを作成するには、次のステップを実行します。
Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。
Webサービス参照が追加された後で、「Webサービスのフォームとレポートの作成」を選択します。
「サービスと操作の選択」で、次の操作を実行します。
Webサービス参照: Webサービス参照を選択します。
操作: 実行方法を選択します。
「ページおよびリージョン属性」で、表示された属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力アイテム」で、次の操作を実行します。
フォームに追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。このステップは、Basic認証が作成時にこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。
ウィンドウ・サービスの結果で、次の操作を実行します。
一時結果セット名: Webサービスの結果を格納するコレクションの名前を入力します。
レポート対象の結果ツリー: 作成されるXML文書(レポートに含める情報を含む)の一部を選択します。
「表示する結果パラメータ」で、レポートに含めるパラメータを選択します。
「終了」をクリックします。
既存のWebサービス参照がある場合は、新しいページを追加して、入力フォームとレポートを作成できます。
新しいページを追加して、フォームとレポートを作成するには、次のステップを実行します。
Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。
新しいページを作成します。「アプリケーション内のページの管理」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「フォーム」を選択します。
「Webサービスのフォームとレポート」を選択します。
「サービスと操作の選択」で、次の操作を実行します。
Webサービス参照: Webサービス参照を選択します。
操作: 実行方法を選択します。
「ページおよびリージョン属性」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力アイテム」で、次の操作を実行します。
フォームに追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。このステップは、Basic認証が作成時にこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。
画面に表示されるステップに従います。
「終了」をクリックします。
Webサービスのフォームの作成ウィザードでは、フォームと送信ボタンが作成されます。WSDLのWebサービス参照を作成した後に、またはページ定義から、このウィザードを実行できます。
このウィザードは、Webサービスの結果がスカラーであることが予想される場合に使用します。株価を調べるWebサービスがよい例です。入力は銘柄記号で、出力はスカラーの適正価格であるためです。
Webサービス参照を作成した後に、フォームを作成するには、次のステップを実行します。
Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。
Webサービス参照が追加された後で、「Webサービスのフォームの作成」を選択します。
「サービスと操作の選択」で、次の操作を実行します。
Webサービス参照: Webサービス参照を選択します。
操作: 実行方法を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
追加するアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「出力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。
このステップは、Webサービス参照を作成したときに、Basic認証がこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。
「終了」をクリックします。
WSDLから作成された既存のWebサービス参照がある場合は、新しいページを追加して、フォームを作成できます。
新しいページを追加して、フォームを作成するには、次のステップを実行します。
Webサービス参照を作成します。「WSDLに基づいたWebサービス参照の作成」を参照してください。
新しいページを作成します。「アプリケーション内のページの管理」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「フォーム」を選択します。
「Webサービスのフォーム」を選択します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「ページおよびリージョン属性の指定」で、ページとリージョン属性を確認します。指定したページが存在しない場合は、ウィザードによってページが作成されます。
「入力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
該当する場合、Basic認証に「アイテム名」および「アイテム・ラベル」を指定します。
このステップは、Webサービス参照を作成したときに、Basic認証がこのWebサービス参照に対して指定された場合にのみ表示されることに注意してください。
「出力パラメータのアイテム」で、次の操作を実行します。
追加する必要があるアイテムを指定します。アイテムを含めるには、「作成」列で「はい」を選択します。アイテムを含めない場合は、「いいえ」を選択します。
必要に応じて、アイテム・ラベルを編集します。
「終了」をクリックします。
ページ上で、Webサービスをプロセスとして実装することもできます。このプロセスを実行すると、リクエストがサービス・プロバイダに送信されます。その後で、レポートにリクエスト結果を表示できます。
Webサービスをプロセスとして起動するには、次のステップを実行します。
新しいページを作成します。「アプリケーション内のページの管理」を参照してください。
「ページの作成」ウィザードで、次のステップを実行します。
「空白ページ」を選択します。
タブの使用を確認するプロンプトが表示されたら、「いいえ」を選択します。
「ページ定義」にナビゲートします。「ページ定義へのアクセス」を参照してください。
「ページ・レンダリング」の「プロセス」で、「作成」アイコンをクリックします。
プロセスのカテゴリから、「Webサービス」を選択します。
プロセス名、順序およびプロセス・ポイントを指定します。
Webサービス参照を選択します。
Web参照がWSDLから作成された場合、次の追加のステップを実行します。
Webサービス参照および実行する操作を選択します。
プロセスを定義します。「Webサービスの出力パラメータ」でオプションを選択すると、結果をコレクションまたはページ上のアイテムに格納できます。
コレクションに結果を格納するには、次のステップを実行します。
「結果の格納場所」で、「コレクション」を選択します。
「値」フィールドにコレクションの名前を入力します。
ページ上のアイテムに結果を格納するには、次のステップを実行します。
「結果の格納場所」で、「アイテム」を選択します。
表示されるフィールドに該当するアイテムの値を入力します。
「プロセスの作成」をクリックします。
Webサービスのリクエスト結果を表示するレポートを作成するには、次のステップを実行します。
「ページ定義」にナビゲートします。「ページ定義へのアクセス」を参照してください。
「リージョン」で、「作成」アイコンをクリックします。
「リージョンの作成」ウィザードが表示されます。
「リージョン・タイプ」で、「レポート」を選択します。
「レポート実装」で、「Webサービスの結果を含むコレクションのレポート」を選択します。「リージョン属性を指定」で、リージョン・タイトルを入力し、オプションでリージョン属性を編集します。
Web参照が手動で作成されたか、またはWSDLから作成されたかを選択します。
Webサービス参照がWSDLから作成された場合、次のステップを実行します。
「Webサービス参照と操作」で、Webサービス参照および実行する操作を選択します。
「レポート対象の結果ツリー」で、作成されるXML文書(レポートに含める情報を含む)の一部を選択します。
「結果パラメータ」で、次の操作を実行します。
「一時結果セット名」に、Webサービスの結果を格納するコレクションの名前を入力します。
該当するパラメータを選択した後、選択解除します。
Webサービス参照が手動で作成された場合、次のステップを実行します。
Webサービス参照を選択します。
SOAPスタイルを選択します。
メッセージの書式を選択します。
レポートの対象となるノードへのXPath式を入力します。
SOAPレスポンス・エンベロープのネームスペースを入力して、「次へ」をクリックします。
レスポンス・メッセージが格納されているコレクション名を入力します。
レポートに含めるパラメータ名を入力します。
「SQLレポートの作成」をクリックします。
WSDLから作成されたWebサービス参照のWebサービス・タイプのプロセスを作成した後で、Webサービス・プロセスを編集すると、入力パラメータを静的な値にマップできます(たとえば、キーを渡すなど)。
Webサービス・プロセスを編集するには、次のステップを実行します。
Webサービス・プロセスを作成します。詳細は、「プロセスとしてのWebサービスの起動」を参照してください。
Webサービス・プロセスが含まれているページ定義にナビゲートします。
プロセス名を選択します。
ページ・プロセスの編集ページが表示されます。
入力パラメータを静的な値にマップするには、次のステップを実行します。
「Webサービスの入力パラメータ」までスクロールします。
該当するパラメータ名の横にある「値」フィールドに値を入力します。
「変更の適用」をクリックします。
「Webサービス履歴」では、カレント・アプリケーションのWebサービス参照の変更が、アプリケーションID、Webサービス参照名、開発者および日付ごとに表示されます。
Webサービス参照の変更履歴を表示するには、次のステップを実行します。
「作業領域」ホームページで、「アプリケーション・ビルダー」アイコンをクリックします。
アプリケーションを選択します。
アプリケーション・ビルダーが表示されます。
「共有コンポーネント」をクリックします。
共有コンポーネント・ページが表示されます。
「ロジック」で、「Webサービス参照」をクリックします。
「履歴」をクリックします。
注意: Webサービス参照ページに「履歴」ボタンが表示されるのは、Webサービス参照を作成した後のみです。 |
Oracle Application Expressでは、リリース3.1から宣言的なBLOB
サポートが提供されているため、開発者はフォームでのファイルのアップロード、およびレポートでのファイルのダウンロードや表示を行うことができます。BLOB
の表示とダウンロードは、 PL/SQLを使用して手続き的に作成することもできます。このセクションでは、ファイルのアップロード、ダウンロードおよび表示を行う方法と、BLOB
列に格納されているファイルを正しく管理するために重要となる追加のファイル属性(MIME
タイプやファイル名など)の管理方法について説明します。この機能を使用すると、簡単にOracle Application Expressアプリケーションを拡張して、イメージ、ドキュメント、ビデオなどのファイルを管理できます。
このセクションの構成は次のとおりです。
フォームを作成(アプリケーションの作成ウィザードを使用して、フォーム・タイプまたはレポートとフォーム・タイプのページを作成するか、あるいはフォーム・タイプのリージョンを作成)した場合や、既存のフォームにアイテムを追加した場合、ソースがBLOB
タイプのデータベース列であるアイテムはすべてファイル参照タイプのアイテムになります。INSERT
に対してフォームがコールされると、ユーザーの選択したファイルがBLOB
列にロードされます。更新に対してフォームがコールされると、「参照」ボタンの右にダウンロード・リンクが表示されます。これにより、ユーザーがファイルをダウンロードできるようになります。
デフォルトのBLOBサポートでは、一般的なアプリケーションでBLOB
を効果的に管理するために必要とされるすべての情報が提供されているわけではありません。 列がBLOB
であるという情報に加えて、ファイルの詳細情報も提供されると、エンド・ユーザーの使いやすさが向上します。この追加情報の管理を簡単に行うために、(DB_COLUMN
に加えて)追加コンポーネントを使用できるようにアイテムのソース属性が拡張されています。
位置 | 属性 | 必須 | 説明 |
---|---|---|---|
1 | BLOB を含む列 |
はい | BLOB タイプの列の名前(大/小文字が区別されます)。 |
2 | MIMEタイプ列 | いいえ | MIME タイプを格納するために使用する列名(大/小文字が区別されます)。 |
3 | ファイル名列 | いいえ | BLOB のファイル名を格納するために使用する列名(大/小文字が区別されます)。ユーザーがファイルをダウンロードするときにNULLの場合は、この列名がデフォルトで使用されます。 |
4 | 最終更新列 | いいえ | BLOB の最終更新日付を格納するために使用する列名(大/小文字が区別されます)。これを指定すると、ファイルをダウンロードする際のHTTPヘッダーに最終変更日が示され、BLOBをブラウザにキャッシュできるようになります。指定しない場合は、ファイルをブラウザにキャッシュできない場合があります。 |
5 | キャラクタ・セット列 | いいえ | BLOB のキャラクタ・セットを格納するために使用する列名(大/小文字が区別されます)。キャラクタ・セットのエンコーディングを維持する必要がある場合など、アジア言語で最も使用されます。 |
6 | コンテンツ配置 | いいえ | inline またはattachment を指定します。その他の値はすべて無視されます。attachment がデフォルト値です。inline はMIME タイプが指定されている場合のみ指定できます。 |
7 | ダウンロード・テキスト | いいえ | ダウンロード・リンクに使用する文字列。何も指定されていない場合は、Download が使用されます。これは置換をサポートしています(翻訳されたアプリケーションに有効です)。 |
次に例を示します。
RESUME:RESUME_MIMETYPE:RESUME_FILENAME:RESUME_LAST_UPDATE::attachment:Resume
ファイル参照タイプのアイテムを使用しており、そのソースが1つ以上のコロンを含むデータベース列(RESUME:
など)である場合、 「ソース」の下にリンク「BLOBダウンロードの書式マスク」が表示されます。このポップアップは、BLOB書式に必要なすべてのパラメータを入力するために役立ちます。
最低でも、1つ以上の末尾のコロンを使用してデータベースのBLOB
列を指定する必要があります(RESUME:
など)。これにより、Oracle Application Expressリリース3.0.1との互換性が維持されます。
ヒント: 実際の例を確認するには、サンプル・アプリケーションのページ6(「Add/Modify Products」)に移動し、アイテムP6_PRODUCT_IMAGEを確認します。「デモンストレーション・アプリケーションの実行」を参照してください。 |
この追加情報を提供するには、MIME
タイプ属性とファイル名属性を格納して追跡するための列を実表に追加することをお薦めします。この追加は表を拡張するだけで簡単に行うことができます。次に例を示します。
ALTER TABLE emp ADD (ATTACH_MIMETYPE VARCHAR2(255), ATTACH_FILENAME VARCHAR2(255), ATTACH_LAST_UPDATE DATE);
フォームを手動で作成している場合も、この機能を利用できます。 DML_PROCESS_ROW
タイプのDMLプロセスを使用して、ファイル・タイプ(ファイル参照)のアイテム内に記述されている書式をページ上で使用します。この処理により、表名と主キーの列が決定されます。
ファイル参照の使用時はNULL
への設定が存在しないため、イメージ参照を削除するメカニズムを提供する必要がある場合は、イメージを削除する特別なボタン(必要な列を無効化する機能を持つボタン)を含める必要があります。次の例を参照してください。
UPDATE demo_product_info SET product_image = NULL, MIMETYPE = NULL, FILENAME = NULL, IMAGE_LAST_UPDATE = NULL, CHARSET = NULL WHERE product_id = :P6_PRODUCT_ID;
ヒント: 実際の例を確認するには、サンプル・アプリケーションのページ6(「Add/Modify Products」)→「Delete Image」プロセスに移動します。「デモンストレーション・アプリケーションの実行」を参照してください。 |
Oracle Application Expressでは、従来のレポートと対話モード・レポートの両方に対するBLOB
サポートが提供されています。ウィザードを使用してレポートを作成し、BLOB
タイプの列を含める場合は、基本的なサポートが含まれます。ダウンロード機能を使いやすくするために、生成後に詳細情報を追加する必要があります。
レポートにダウンロード・リンクを容易に含めることができるように、レポートにはBLOB
の長さ(dbms_lob.getlength(RESUME)
など)を選択します。長さが0の場合、BLOB
はNULL
となり、ダウンロード・リンクは表示されません。同様に、ダウンロード・リンクの書式を設定できる、日付または数に対する書式マスクを指定します。DOWNLOAD書式は、次の例のように3つ以上のパラメータを指定する必要があるという点で他の書式マスクより複雑です。
DOWNLOAD:EMP:RESUME:EMPNO
次の表に、DOWNLOAD書式のパラメータの説明を示します。
位置 | 属性 | 必須 | 説明 |
---|---|---|---|
1 | DOWNLOAD | はい | DOWNLOADレポート書式マスクを示します。 |
2 | 表名 | はい | BLOB タイプのターゲット列を含む表の名前(大/小文字が区別されます)。 |
3 | BLOBを含む列 | はい | BLOB タイプの列の名前(大/小文字が区別されます)。 |
4 | 主キー列1 | はい | 主キー列1の名前(大/小文字が区別されます)。 |
5 | 主キー列2 | いいえ | 主キー列2の名前(大/小文字が区別されます)。 |
6 | MIMEタイプ列 | いいえ | MIME タイプを格納するために使用する列名(大/小文字が区別されます)。 |
7 | ファイル名列 | いいえ | BLOB のファイル名を格納するために使用する列名(大/小文字が区別されます)。ユーザーがファイルをダウンロードするときにNULL の場合は、この列名がデフォルトで使用されます。 |
8 | 最終更新列 | いいえ | BLOB の最終更新日付を格納するために使用する列名(大/小文字が区別されます)。これを指定すると、ファイルをダウンロードする際のHTTPヘッダーに最終変更日が示され、BLOB をWebブラウザにキャッシュできるようになります。指定しない場合は、ファイルをブラウザにキャッシュできない場合があります。 |
9 | キャラクタ・セット列 | いいえ | BLOB のキャラクタ・セットを格納するために使用する列名(大/小文字が区別されます)。キャラクタ・セットのエンコーディングを維持する必要がある場合など、アジア言語で最も使用されます。 |
10 | コンテンツ配置 | いいえ | inline またはattachment を指定します。その他の値はすべて無視されます。MIME タイプが提供され、ファイルが表示可能なタイプである場合は、ファイルが表示されます。MIME タイプが提供されていない場合、またはファイルをインラインで表示できない場合、ユーザーはダウンロードを行うように求められます。 |
11 | ダウンロード・テキスト | いいえ | ダウンロード・リンクに使用する文字列。何も指定されていない場合は、Download が使用されます。これは置換をサポートしています(翻訳されたアプリケーションに有効です)。 |
次に例を示します。
DOWNLOAD:EMP:RESUME:EMPNO::RESUME_MIMETYPE:RESUME_FILENAME:RESUME_LAST_UPDATE::attachment:Resume
DOWNLOAD:
で始まる書式マスクを使用するレポート列がある場合、書式の下にリンク「BLOBダウンロードの書式マスク」が表示されます。このポップアップは、DOWNLOAD書式に必要なすべてのパラメータを入力するために役立ちます。
ヒント: 実際の例を確認するには、サンプル・アプリケーションのページ29(「Master Detail」)→「Items for Order #&P29_ORDER_ID. 」リージョン→「Product Image」列に移動します。「デモンストレーション・アプリケーションの実行」を参照してください。 |
作業中のBLOB
がイメージである場合は、レポートでも表示できます。そのためには、新しいレポート書式マスク「IMAGE」を使用します。 MIME
タイプに関係なく、レポートでは常にBLOBの表示が試行されます。BLOBのレンダリングを行うことができない場合は、壊れたイメージが表示されます。
次の表に、IMAGE書式マスクのパラメータの説明を示します。
位置 | 属性 | 必須 | 説明 |
---|---|---|---|
1 | IMAGE | はい | IMAGEレポート書式マスクを示します。 |
2 | 表名 | はい | BLOB タイプのターゲット列を含む表の名前(大/小文字が区別されます)。 |
3 | BLOBを含む列 | はい | BLOB タイプの列の名前(大/小文字が区別されます)。 |
4 | 主キー列1 | はい | 主キー列1の名前(大/小文字が区別されます)。 |
5 | 主キー列2 | いいえ | 主キー列2の名前(大/小文字が区別されます)。 |
6 | MIMEタイプ列 | いいえ | MIME タイプを格納するために使用する列名(大/小文字が区別されます)。 |
7 | ファイル名列 | いいえ | IMAGE書式には使用されませんが、 書式をIMAGEとDOWNLOAD間で簡単に変更できるように残されています。 |
8 | 最終更新列 | いいえ | BLOB の最終更新日付を格納するために使用する列名(大/小文字が区別されます)。これを指定すると、ファイルをダウンロードする際のHTTPヘッダーに最終変更日が示され、BLOB をWebブラウザにキャッシュできるようになります。指定しない場合は、ファイルをブラウザにキャッシュできない場合があります。 |
9 | キャラクタ・セット列 | いいえ | IMAGE書式には使用されませんが、 書式をIMAGEとDOWNLOAD間で簡単に変更できるように残されています。 |
10 | コンテンツ配置 | いいえ | IMAGE書式には使用されませんが、 書式をIMAGEとDOWNLOAD間で簡単に変更できるように残されています。 |
11 | 代替テキスト | いいえ | イメージに関連付けられたaltタグに使用する文字列。 |
次に例を示します。
IMAGE:EMP:RESUME:EMPNO::RESUME_MIMETYPE:RESUME_FILENAME:RESUME_LAST_UPDATE::attachment:Resume
「IMAGE:」で始まる書式マスクを使用するレポート列がある場合、書式の下にリンク「BLOBダウンロードの書式マスク」が表示されます。このポップアップは、IMAGE書式に必要なすべてのパラメータを入力するために役立ちます。
埋込み方法を使用してダウンロード・リンクを提供するかわりに、APEX_UTIL.GET_BLOB_FILE_SRC
ファンクションを使用することもできます。この方法の利点は、イメージ表示の体裁を(heightとwidthタグで)より具体的に指定できることです。この方法は、有効なOracle Application Expressセッションからコールされた場合にのみ有効です。また、BLOB
を記述するパラメータを、アプリケーション内の有効なアイテムの書式としてリストする必要もあります。これにより、ファンクションからそのアイテムが参照されます。
参照: Oracle Application Express APIリファレンスの「GET_BLOB_FILE_SRCファンクション」 |