4 PL/SQL Gateway用のOracle Multimedia Code Wizardサンプル・アプリケーション
PL/SQL Gateway用のOracle Multimedia Code Wizardサンプル・アプリケーションでは、Oracle Multimediaオブジェクト型を使用してデータベースに格納されたマルチメディア・データをアップロードおよび取得するPL/SQL GatewayのPL/SQLプロシージャを作成します。
このアプリケーションでは、次のことを想定しています。
-
PL/SQL Gatewayを使用したPL/SQLアプリケーションの開発に精通している。
-
Oracle Multimedia Code Wizardサンプル・アプリケーションをすでにインストールおよび構成している。
Oracle Multimedia Code Wizardサンプル・アプリケーションは、Oracle Technology Network (OTN)からダウンロード可能なOracle Database Examplesのメディアからインストールできます。Oracle Database Examplesメディアをインストールした後、サンプル・アプリケーション・ファイルとREADME.txt
ファイルは次の場所にあります。
<ORACLE_HOME>
/ord/http/demo/plsgwycw
(LinuxおよびUNIXの場合)
<ORACLE_HOME>
\ord\http\demo\plsgwycw
(Windowsの場合)
この章では、Code Wizardサンプル・アプリケーションの実行方法を説明します。このサンプル・アプリケーションをインストールおよび構成する場合の追加要件および手順については、README.txt
ファイルを参照してください。
この章では、次の内容を説明します。
関連項目:
Oracle Multimediaのオブジェクト型を使用してメディアをアップロードおよび取得するためにPL/SQLスクリプトを使用するフォト・アルバム・サンプルWebアプリケーションについては、「Oracle Multimedia PL/SQLフォト・アルバム・サンプル・アプリケーション」を参照してください。
4.1 Code Wizardサンプル・アプリケーションの実行
このトピックでは、Code Wizardアプリケーションの実行方法について説明します。
Code Wizardサンプル・アプリケーションを使用してテスト・メディア・アクセス・プロシージャを作成およびテストするには、次の手順を実行する必要があります。
- Code Wizardで使用する、新しいデータベース・アクセス記述子(DAD)を作成するか、または既存のDADを選択します。
- Code Wizardの管理機能を使用して、DADの使用を認可します。
- メディアのアップロード・プロシージャおよび取得プロシージャを作成します。
4.2 Code Wizardサンプル・アプリケーションの説明
Code Wizardサンプル・アプリケーションを使用して、データベースに格納されたメディア・データ(イメージ、オーディオ、ビデオおよび一般的なメディア)をアップロードおよび取得するPL/SQL GatewayのPL/SQLストアド・プロシージャを作成できます。
Oracle Multimedia Code Wizardサンプル・アプリケーションでは、Oracle Multimediaのこれらのオブジェクト型とそれぞれのメソッドが使用されます。
-
ORDImage
-
ORDAudio
-
ORDVideo
-
ORDDoc
Code Wizardでは、表示される手順に従って、メディア取得プロシージャまたはメディア・アップロード・プロシージャを作成できます。スタンドアロン・メディア・アクセス・プロシージャを作成およびコンパイルできます。または、PL/SQLパッケージに含めるメディア・アクセス・プロシージャのソースを作成できます。最後に、メディア・アクセス・プロシージャを作成した後、特定のアプリケーション要件を満たすようにカスタマイズできます。
これらのプロセスは、Oracle Multimedia PL/SQL Web Toolkitフォト・アルバム・アプリケーションがinsert_new_photo
プロシージャをイメージ・アップロード・プロシージャとして使用し、deliver_media
プロシージャをイメージ取得プロシージャとして使用する方法と同様です。
次の項では、Code Wizardアプリケーションの使用方法について説明します。
4.2.1 新しいDADの作成または既存のDADの選択
メディアのアップロードまたは取得プロシージャを作成するには、Code Wizardで使用する1つ以上のデータベース・アクセス記述子(DAD)を選択する必要があります。スキーマ表が不正に参照されたり、メディア・アクセス・プロシージャが不正に作成されることを防ぐために、Code Wizardの管理機能を使用して各DADを認可する必要があります。
データベースおよびアプリケーションのセキュリティ要件に応じて、Code Wizard専用の新規DADを1つ以上作成して認可できます。または、既存の1つ以上のDADの使用を認可できます。
Code Wizardでの使用を認可したDADには、なんらかのユーザー認証方式を採用することをお薦めします。最も簡単な方法は、データベース認証を使用するDADを作成または使用することです。この方法を行うには、DAD仕様で「Basic Authentication Mode」を選択し、パスワードを空白のままにします。または、既存のアプリケーション固有の認証方式を指定したDADを使用することもできます。
次の例では、SCOTT
スキーマのメディア・アップロードおよび取得プロシージャを作成およびテストできるDADの作成方法について説明します。
注意:
メディア・アップロード・プロシージャをテストするには、DADでドキュメント表の名前を指定する必要があります。アップロード・プロシージャをテストする場合は、プロシージャの作成に使用したDADまたはアプリケーションへのアクセスに使用したDADを選択できます。DADを作成するときにドキュメント表名を選択するか、後でDADを編集してドキュメント表名を指定するか、またはドキュメント表名を指定する既存のDADを使用するかを選択できます。この例では、DADの作成時にドキュメント表名を指定する方法を示します。
- Webブラウザで、Oracle HTTP Serverのホームページを開きます。「管理」ページで「PL/SQLのプロパティ」を選択して、mod_plsqlの「サービス」ページを開きます。
- mod_plsqlサービス・ページで、DAD Statusセクションまでスクロールします。次に、「作成」をクリックして「DADタイプ」ページを開きます。
- DADタイプとして「一般」を選択します。その後、「次」をクリックして「データベース接続」ページを開きます。
- 「DAD名」フィールドに
/scottcw
と入力します。データベース・アカウントにSCOTT
と入力し、パスワードは空白にします。「Database Connectivity Information」セクションに、接続情報を入力します。「デフォルト・ページ」フィールドにORDCWPKG.MENU
と入力し、他のフィールドは空白のままにします。その後、「次」をクリックしてドキュメント、別名およびセッション・ページを開きます。 - ドキュメント、別名およびセッション・ページで、「ドキュメント表」に
MEDIA_UPLOAD_TABLE
と入力します。さらに、「適用」をクリックします。 - 変更内容を有効にするために、Oracle HTTP Serverを再起動します。
関連項目:
DADの構成の詳細は、『Oracle Database開発ガイド』を参照してください
4.2.2 DADの認可
Code Wizardを使用するには、最初にデータベース・アクセス記述子(DAD)を認可する必要があります。
DADをCode Wizardで使用するように認可するには、次の手順を実行します。
関連項目:
DADの構成の詳細は、『Oracle Database開発ガイド』を参照してください
4.2.3 メディアのアップロード・プロシージャおよび取得プロシージャの作成およびテスト
データベース・アクセス記述子(DAD)を指定して認証すると、このアプリケーションを実行してメディアのアップロードおよび取得プロシージャを作成する準備ができます。
すべての設定作業が完了した後にCode Wizardを起動するには、次の手順に従います。
メディア・アップロード・プロシージャまたはメディア取得プロシージャを作成するには、「Main menu」ページで適切なオプションを選択し、「Next」をクリックします。Code Wizardに表示される手順に従って、プロシージャを作成できます。
スタンドアロンのメディア・アップロードまたは取得プロシージャを作成する場合は、プロシージャのコンテンツを表示してテストできます。
関連項目:
埋込みPL/SQL Gatewayの使用の詳細は、『Oracle Database開発ガイド』を参照してください
4.2.4 メディアのアップロード・プロシージャの作成
Oracle Multimedia Code Wizard for the PL/SQL Gatewayを使用してメディアのアップロード・プロシージャを作成するには、このプロセスを実行します。
関連項目
4.2.5 メディアの取得プロシージャの作成
Oracle Multimedia Code Wizard for the PL/SQL Gatewayを使用してメディアの取得プロシージャを作成するには、このプロセスを実行します。
関連項目
4.2.6 PL/SQL Gatewayドキュメント表の使用
PL/SQL Gatewayを使用してアップロードしたすべてのファイルは、ドキュメント表に格納されます。Code Wizardによって作成されたメディアのアップロード・プロシージャは、アップロードされたイメージを、指定されたドキュメント表からアプリケーションの表に自動的に移動します。別のアプリケーション・コンポーネントが使用しているドキュメント表に、一時ファイルが一時的に表示されないようにするには、ドキュメントの永続的な格納に使用されていないドキュメント表を使用します。
選択したドキュメント表は、アプリケーションのデータベース・アクセス記述子(DAD)に指定します。DADに別のドキュメント表が指定されている場合、メディアのアップロード・プロシージャ用の新しいDADを作成します。新しいドキュメント表の作成を選択した場合、Code Wizardによって次の形式の表が作成されます。
CREATE TABLE document-table-name ( name VARCHAR2(256) UNIQUE NOT NULL, mime_type VARCHAR2(128), doc_size NUMBER, dad_charset VARCHAR2(128), last_updated DATE, content_type VARCHAR2(128), blob_content BLOB ) -- -- store BLOBs as SecureFiles LOBs -- LOB(blob_content) STORE AS SECUREFILE;
関連項目:
ファイルのアップロードとドキュメント表の詳細は、『Oracle Database開発ガイド』を参照してください
4.2.7 タイムゾーン情報を使用したブラウザでのキャッシュのサポート
ブラウザでWebサーバーから受信したリソースをキャッシュし、それらのリソースを後続のリクエストへのレスポンスに使用すると、ユーザーへのレスポンス時間が短縮され、ネットワーク・トラフィックを軽減できます。この項では、ブラウザのキャッシュ・メカニズムの動作方法と、Code Wizardユーティリティ・パッケージを使用してこのメカニズムをサポートする方法についておおまかに説明します。この項の説明では、すべてのHTTPの日時スタンプを協定世界時(UTC)で表します。
すべてのHTTPレスポンスには、レスポンスが生成された日時を示すDateヘッダーが含まれます。Webサーバーがブラウザからのリクエストに対してリソースを送信する場合、リクエストされたリソースの最終変更日時を示すLast-Modified HTTPレスポンス・ヘッダーも含めることができます。Last-ModifiedヘッダーはDateヘッダーよりも後にならないようにする必要があります。
リソースを受信してキャッシュした後、同じリソースをブラウザで再度取得する必要がある場合、ブラウザは、リソースが前回取得およびキャッシュされたときにアプリケーション・サーバーから返されたLast-Modified日付の値をIf-Modified-Sinceリクエスト・ヘッダー指定して、リクエストをWebサーバーに送信します。このリクエストを受信したWebサーバーは、If-Modified-Sinceリクエスト・ヘッダーの日付をリソースの最終更新時刻と比較します。リソースがまだ存在し、ブラウザでキャッシュされた後に変更されていない場合、Webサーバーは、レスポンス本文なしのHTTP 304 Not Modified
ステータスで応答し、現在キャッシュに格納されているリソースをブラウザが使用できることを示します。また、リソースがまだ存在し、リクエストにIf-Modified-Sinceヘッダーが含まれていないかリソースがブラウザでキャッシュされた後に更新されている場合、WebサーバーはHTTP 200 OK
ステータスで応答し、リソースをブラウザに送信します。
ORDImage、ORDAudio、ORDVideoおよびORDDocのすべてのオブジェクトには、埋込みORDSourceオブジェクトにDATEとして格納されたupdateTime属性があります。DATEデータ型ではタイム・ゾーンまたは夏時間がサポートされませんが、Oracle Databaseはタイム・ゾーンをサポートし、データベースに格納されたDATE値をUTCに変換するファンクションも提供しています。
レスポンスが最初にブラウザに返されるときに、メディア取得プロシージャはupdateTime属性に基づいてLast-Modified HTTPレスポンス・ヘッダーを設定します。メディア・データのリクエストにIf-Modified-Sinceヘッダーが含まれる場合、メディア取得プロシージャは値をupdateTime属性と比較し、適切なレスポンスを返します。ブラウザのキャッシュ内のリソースがまだ有効な場合は、レスポンス本文なしでHTTP 304 Not Modified
ステータスが返されます。ブラウザによってキャッシュされた後にリソースが更新されている場合は、レスポンス本文としてHTTP 200 OK
ステータスがメディア・リソースとともに返されます。Code Wizardによって作成されたメディア取得プロシージャは、ユーティリティ・パッケージをコールして、データベースに格納されているDATE値をUTCに変換します。ユーティリティ・パッケージは、Oracle Databaseに格納されているタイム・ゾーン情報とdateおよびtimeファンクションを使用して、データベースの日時スタンプをUTCに変換します。結果の日付が前に説明したLast-Modified日付のルールに準拠するようにするには、タイム・ゾーン情報が正しく指定されている必要があります。
関連項目:
-
HTTP仕様の詳細は、W3C HTTP-Hypertext Transfer Protocolを参照してください。
-
データベースにタイム・ゾーンを設定する方法の詳細は、『Oracle Database管理者ガイド』を参照してください
-
dateおよびtimeファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください
4.3 サンプル・セッション: イメージの使用
このサンプル・セッションでは、SCOTT
スキーマを使用して、イメージ・メディアのアップロード・プロシージャおよび取得プロシージャを作成する方法を示します。別のスキーマを使用するには、別のスキーマ名とパスワードで置換します。また、SCOTT
スキーマのパスワードを変更した場合は、その新しいパスワードを使用します。
次の手順を実行します。
- 手順1.表を作成する権限でスキーマに接続した後にアプリケーションのイメージを格納する表を作成します。
-
次に例を示します。
SQL> CREATE TABLE cw_images_table( id NUMBER PRIMARY KEY, description VARCHAR2(30) NOT NULL, location VARCHAR2(30), image ORDSYS.ORDIMAGE ) -- -- store media as SecureFiles LOBs -- LOB(image.source.localdata) STORE AS SECUREFILE;
-
手順2.プロシージャの作成に使用する
SCOTTCW
DADを作成します。 -
-
Webブラウザで、Oracle HTTP Serverのホームページを開きます。「管理」ページで「PL/SQLのプロパティ」を選択して、mod_plsqlの「サービス」ページを開きます。
-
mod_plsqlサービス・ページで、DAD Statusセクションまでスクロールします。次に、「作成」をクリックして「DADタイプ」ページを開きます。
-
DADタイプとして「一般」を選択します。その後、「次」をクリックして「データベース接続」ページを開きます。
-
「DAD名」フィールドに
/scottcw
と入力します。データベース・アカウントにSCOTT
と入力し、パスワードは空白にします。「Database Connectivity Information」セクションに、接続情報を入力します。「デフォルト・ページ」フィールドにORDCWPKG.MENU
と入力し、他のフィールドは空白のままにします。その後、「次」をクリックしてドキュメント、別名およびセッション・ページを開きます。 -
ドキュメント、別名およびセッション・ページで、「ドキュメント表」に
MEDIA_UPLOAD_TABLE
と入力します。次に「適用」をクリックします。 -
変更内容を有効にするために、Oracle HTTP Serverを再起動します。
-
-
手順3.Code Wizardで
SCOTTCW
DADおよびSCOTT
スキーマの使用を認可します。 -
-
Code Wizardの管理URLをブラウザのアドレス・バーに入力し、ブラウザの表示に従って
ORDSYS
ユーザー名およびパスワードを入力します。次に例を示します。http://
<hostname>
:<port-number>
/ordcwadmin -
Code Wizardの「Main menu」でDAD認可ファンクションを選択し、「Next」をクリックします。デモDADの名前
SCOTTCW
、およびユーザー名SCOTT
を入力し、「Apply」をクリックします。確認ウィンドウが表示されたら、「Done」をクリックします。
-
-
手順4.DADを
SCOTTCW
DADに変更します。 -
-
Code Wizardの「Main menu」で「Change DAD」をクリックします。
-
「Change to SCOTTCW」が選択されていない場合はそれをクリックし、「Next」をクリックします。
-
ユーザー名とパスワードを求められたら、ユーザー名
SCOTT
およびそのパスワードを入力し、「OK」をクリックします。「Main menu」に、現行DADとして
SCOTTCW
、現行スキーマとしてSCOTT
が表示されます。
-
- 手順5.メディアのアップロード・プロシージャを作成およびテストします。
-
「Main menu」で「Create media upload procedure」をクリックし、「Next」をクリックします。
-
データベース表およびプロシージャ・タイプを選択します。
-
「CW_IMAGES_TABLE」データベース表をクリックします。
-
「Standalone procedure」をクリックします。
-
「Next」をクリックします。
-
-
PL/SQLドキュメント・アップロード表を選択します。
SCOTT
スキーマにドキュメント表が存在しない場合、Code Wizardにその旨を示すメッセージが表示されます。この場合、表示されているデフォルトの表名CW_SAMPLE_UPLOAD_TABLE
を受け入れて、「Next」をクリックします。既存のドキュメント表に
CW_SAMPLE_UPLOAD_TABLE
が含まれていない場合、「Create new document table」をクリックし、表示されているデフォルトの表名CW_SAMPLE_UPLOAD_TABLE
を受け入れて、「Next」をクリックします。CW_SAMPLE_UPLOAD_TABLE
ドキュメント表が存在する場合、「Use existing document table」および「CW_SAMPLE_UPLOAD_TABLE」オプションが選択されていることを確認します。「Next」をクリックします。 -
データ・アクセスおよびメディア列を選択します。
-
「IMAGE (ORDIMAGE)」をクリックします。
-
「ID (Primary key)」をクリックします。
-
「Conditional insert or update」をクリックします。
-
「Next」をクリックします。
-
-
追加の列およびプロシージャ名を選択します。
-
DESCRIPTION列には
NOT NULL
制約が定義されているため、「DESCRIPTION」が選択されていることを確認します。(LOCATION列には制約がないため、デフォルトではチェックされていません。) -
表示されているプロシージャ名「
UPLOAD_CW_IMAGES_TABLE_IMAGE
」を受け入れます。 -
「Create procedure in the database」をクリックします。
-
「Next」をクリックします。
-
-
選択したプロシージャ作成オプションを確認します。次のとおり表示されます。
Procedure type: Standalone Table name: CW_IMAGES_TABLE Media column(s): IMAGE (ORDIMAGE) Key column: ID Additional column(s): DESCRIPTION Table access mode: Conditional update or insert Procedure name: UPLOAD_CW_IMAGES_TABLE_IMAGE Function: Create procedure in the database
「Finish」をクリックします。
-
プロシージャをコンパイルし、生成されたソース情報を確認します。
Code Wizardに次のメッセージが表示されます。
Procedure created successfully: UPLOAD_CW_IMAGES_TABLE_IMAGE
-
オプションの「Click to display generated source:」で「View」をクリックし、生成されたソースを別のウィンドウに表示します。生成されたソースを、手順5の6gの最後に示します。
-
生成されたソースを確認したら、ウィンドウを閉じます。
-
「DAD:」に表示されている「
SCOTTCW
」を受け入れて、「Test」をクリックします。生成されたプロシージャのテストに使用するテンプレート・ファイル・アップロード・フォームが別のウィンドウに表示されます -
テンプレート・ファイル・アップロード・フォームをカスタマイズするには、ブラウザの「ファイル」メニューから「名前を付けて保存...」を選択して、編集用にHTMLソースを保存します。
-
テンプレート・ファイル・アップロード・フォームをテストするには、次の情報を入力します。
-
ID列用に、行の主キーとして数値
1
を入力します。 -
IMAGE列用に、「Browse...」をクリックして、 データベースにアップロードするイメージ・ファイルを選択します。
-
DESCRIPTION列用に、イメージの簡単な説明を入力します。
-
「Upload media」をクリックします。
Code Wizardによって、「Oracle Multimedia Code Wizard: Template Upload Procedure」という見出しのテンプレート完了ウィンドウが表示されます。プロシージャが正常に実行された場合、メッセージ「
Media uploaded successfully
」が表示されます。 -
-
ウィンドウを閉じます。
-
「Compile procedure and review generated source」ウィンドウの「Done」をクリックして、Code Wizardの「Main menu」に戻ります。
生成されたイメージ・アップロード・プロシージャのコピーを次に示します。
CREATE OR REPLACE PROCEDURE UPLOAD_CW_IMAGES_TABLE_IMAGE ( in_ID IN VARCHAR2, in_IMAGE IN VARCHAR2 DEFAULT NULL, in_DESCRIPTION IN VARCHAR2 DEFAULT NULL ) AS local_IMAGE ORDSYS.ORDIMAGE := ORDSYS.ORDIMAGE.init(); local_ID CW_IMAGES_TABLE.ID%TYPE := NULL; upload_size INTEGER; upload_mimetype VARCHAR2( 128 ); upload_blob BLOB; BEGIN -- -- Update the existing row. -- UPDATE CW_IMAGES_TABLE mtbl SET mtbl.IMAGE = local_IMAGE, mtbl.DESCRIPTION = in_DESCRIPTION WHERE mtbl.ID = in_ID RETURN mtbl.ID INTO local_ID; -- -- Conditionally insert a new row if no existing row is updated. -- IF local_ID IS NULL THEN -- -- Insert the new row into the table. -- INSERT INTO CW_IMAGES_TABLE ( ID, IMAGE, DESCRIPTION ) VALUES ( in_ID, local_IMAGE, in_DESCRIPTION ); END IF; -- -- Select Oracle Multimedia object(s) for update. -- SELECT mtbl.IMAGE INTO local_IMAGE FROM CW_IMAGES_TABLE mtbl WHERE mtbl.ID = in_ID FOR UPDATE; -- -- Store media data for the column in_IMAGE. -- IF in_IMAGE IS NOT NULL THEN SELECT dtbl.doc_size, dtbl.mime_type, dtbl.blob_content INTO upload_size, upload_mimetype, upload_blob FROM CW_IMAGE_UPLOAD_TABLE dtbl WHERE dtbl.name = in_IMAGE; IF upload_size > 0 THEN dbms_lob.copy( local_IMAGE.source.localData, upload_blob, upload_size ); local_IMAGE.setLocal(); BEGIN local_IMAGE.setProperties(); EXCEPTION WHEN OTHERS THEN local_IMAGE.contentLength := upload_size; local_IMAGE.mimeType := upload_mimetype; END; END IF; DELETE FROM CW_IMAGE_UPLOAD_TABLE dtbl WHERE dtbl.name = in_IMAGE; END IF; -- -- Update Oracle Multimedia objects in the table. -- UPDATE CW_IMAGES_TABLE mtbl SET mtbl.IMAGE = local_IMAGE WHERE mtbl.ID = in_ID; -- -- Display the template completion message. -- htp.print( '<html>' ); htp.print( '<title>Oracle Multimedia Code Wizard: Template Upload Procedure</title>' ); htp.print( '<body>' ); htp.print( '<h2> Oracle Multimedia Code Wizard: Template Upload Procedure</h2>' ); htp.print( 'Media uploaded successfully.' ); htp.print( '</body>' ); htp.print( '</html>' ); END UPLOAD_CW_IMAGES_TABLE_IMAGE;
前のイメージ・アップロード・プロシージャで宣言される入力パラメータおよび変数を次に示します。
-
このプロシージャの宣言部では、
in_ID
、in_IMAGE
およびin_DESCRIPTION
の3つの入力パラメータが宣言され、先頭以外の2つのパラメータがNULL
に初期化されます。 -
サブプログラム・セクションでは、次の変数が宣言されます。
-
変数
local_IMAGE
にはORDSYS.ORDIMAGEデータ型が割り当てられ、ORDIMAGE.init( )メソッドによって空のBLOBで初期化されます。 -
変数
local_ID
は、表CW_IMAGES_TABLE
のID
列と同じデータ型を取り、NULL
に初期化されます。 -
追加の3つの変数
upload_size
、upload_mimetype
およびupload_blob
が宣言されます。これらの変数には、後で、イメージのBLOBデータのコンテンツをORDSYS.ORDIMAGE.source.localData属性にコピーする準備として、SELECT文によってドキュメント表CW_IMAGE_UPLOAD_TABLE
の対応する列名doc_size
、mime_type
およびblob_content
から値が割り当てられます。
-
外側のBEGIN...END実行文部は、次の操作を実行します。
-
CW_IMAGES_TABLE
表で既存の行のIMAGE
列およびDESCRIPTION
列を更新し、ID
列の値がin_ID
入力パラメータの値と一致するlocal_ID
の値を戻します。 -
戻された
local_ID
の値がNULL
である場合、条件付きで新しい行を表CW_IMAGES_TABLE
に挿入し、image
列内のORDImageオブジェクト型のインスタンスを空のBLOBで初期化します。 -
表
CW_IMAGES_TABLE
で、ID
列の値がin_ID
入力パラメータの値と一致するORDImageオブジェクト列IMAGE
を更新対象として選択します。 -
ドキュメント表で、
Name
列の値がin_IMAGE
入力パラメータの値と一致する行を選択し、その行のdoc_size
、mime_type
およびblob_content
列の値をupload_size
、upload_mimetype
およびupload_blob
変数に渡します。 -
DBMS_LOBによって、BLOBデータを表
CW_IMAGE_UPLOAD_TABLE
からORDSYS.ORDIMAGE.source.localData属性にコピーし、setLocal( )メソッドをコールして、イメージ・データがBLOBでローカルに格納されていることを示し、ORDImageメソッドはsource.localData属性内で対応するデータを検索する必要があることを示します。 -
内側の実行ブロックでは、ORDImageのsetProperties( )メソッドをコールして、イメージ・データを読み取り、オブジェクトの属性値を取得し、それらの値をORDImagオブジェクトのイメージ・オブジェクト属性に格納します。
-
setProperties( )コールが正常に実行されなかった場合、例外を捕捉し、contentLength( )メソッドをコールしてイメージのサイズを取得し、mimeType( )メソッドをコールしてイメージのMIMEタイプを取得します。
-
表
CW_IMAGES_TABLE
で、Name
列の値がin_IMAGE
入力パラメータの値と一致する行にコピーされたデータを含む行を、ドキュメント表CW_IMAGE_UPLOAD_TABLE
から削除します。 -
表
CW_IMAGES_TABLE
のORDImageオブジェクトのIMAGE
列を、ID
列の値がin_ID
入力パラメータの値と一致する変数local_IMAGE
のコンテンツで更新します。 -
PL/SQL Web Toolkitの
htp.print
ファンクションを使用して、メディアが正常にアップロードされた旨を示す完了メッセージをHTMLページに表示します。
-
-
- 手順6.メディアの取得プロシージャを作成およびテストします。
-
「Main menu」で「Create media retrieval procedure」を選択し、「Next」をクリックします。
-
データベース表およびプロシージャ・タイプを選択します。
-
「CW_IMAGES_TABLES」をクリックします。
-
「Standalone procedure」をクリックします。
-
「Next」をクリックします。
-
-
メディア列およびキー列を選択します。
-
「IMAGE (ORDIMAGE)」をクリックします。
-
「ID (Primary key)」をクリックします。
-
「Next」をクリックします。
-
-
プロシージャ名およびパラメータ名を選択します。
-
表示されているプロシージャ名「
GET_CW_IMAGES_TABLE_IMAGE
」を受け入れます。 -
表示されているパラメータ名「
MEDIA_ID
」を受け入れます。 -
「Create procedure in the database」をクリックします。
-
「Next」をクリックします。
-
-
選択したプロシージャ作成オプションを確認します。次のとおり表示されます。
Procedure type: Standalone Table name: CW_IMAGES_TABLE Media column(s): IMAGE (ORDIMAGE) Key column: ID Procedure name: GET_CW_IMAGES_TABLE_IMAGE Parameter Name: MEDIA_ID Function: Create procedure in the database
「Next」をクリックします。
-
プロシージャをコンパイルし、生成されたソースを確認します。
Code Wizardに次のメッセージが表示されます。
Procedure created successfully: GET_CW_IMAGES_TABLE_IMAGE
-
「View」をクリックして、生成されたソースを別のウィンドウに表示します。生成されたソースを確認したら、ウィンドウを閉じます。生成されたソースを、手順6の5eの最後に示します。
-
GET_CW_IMAGES_TABLE_IMAGE
プロシージャを使用したイメージの取得に使用するURL形式を確認します。 -
「Key parameter」に数値
1
を入力し、「Test」をクリックして、前にアップロードしたイメージを取得することでプロシージャをテストします。取得されたイメージが別のウィンドウに表示されます。
-
ウィンドウを閉じます。
-
「Done」をクリックして「Main menu」に戻ります。
生成されたイメージ取得プロシージャを次に示します。
CREATE OR REPLACE PROCEDURE GET_CW_IMAGES_TABLE_IMAGE ( MEDIA_ID IN VARCHAR2 ) AS localObject ORDSYS.ORDIMAGE; localBlob BLOB; localBfile BFILE; httpStatus NUMBER; lastModDate VARCHAR2(256); BEGIN -- -- Retrieve the object from the database into a local object. -- BEGIN SELECT mtbl.IMAGE INTO localObject FROM CW_IMAGES_TABLE mtbl WHERE mtbl.ID = MEDIA_ID; EXCEPTION WHEN NO_DATA_FOUND THEN ordplsgwyutil.resource_not_found( 'MEDIA_ID', MEDIA_ID ); RETURN; END; -- -- Check the update time if the browser sent an If-Modified-Since header. -- IF ordplsgwyutil.cache_is_valid( localObject.getUpdateTime() ) THEN owa_util.status_line( ordplsgwyutil.http_status_not_modified ); RETURN; END IF; -- -- Figure out where the image is. -- IF localObject.isLocal() THEN -- -- Data is stored locally in the localData BLOB attribute. -- localBlob := localObject.getContent(); owa_util.mime_header( localObject.getMimeType(), FALSE ); ordplsgwyutil.set_last_modified( localObject.getUpdateTime() ); owa_util.http_header_close(); IF owa_util.get_cgi_env( 'REQUEST_METHOD' ) <> 'HEAD' THEN wpg_docload.download_file( localBlob ); END IF; ELSIF UPPER( localObject.getSourceType() ) = 'FILE' THEN -- -- Data is stored as a file from which ORDSource creates -- a BFILE. -- localBfile := localObject.getBFILE(); owa_util.mime_header( localObject.getMimeType(), FALSE ); ordplsgwyutil.set_last_modified( localObject.getUpdateTime() ); owa_util.http_header_close(); IF owa_util.get_cgi_env( 'REQUEST_METHOD' ) <> 'HEAD' THEN wpg_docload.download_file( localBfile ); END IF; ELSIF UPPER( localObject.getSourceType() ) = 'HTTP' THEN -- -- The image is referenced as an HTTP entity, so we have to -- redirect the client to the URL that ORDSource provides. -- owa_util.redirect_url( localObject.getSource() ); ELSE -- -- The image is stored in an application-specific data -- source type for which no default action is available. -- NULL; END IF; END GET_CW_IMAGES_TABLE_IMAGE;
前に示したイメージ取得プロシージャで宣言される入力パラメータおよび変数を次に示します。
-
このプロシージャの宣言部では、1つの入力パラメータ
MEDIA_ID
が宣言されます。 -
サブプログラム・セクションでは、次の変数が宣言されます。
-
変数
localObject
には、ORDSYS.ORDIMAGEデータ型が割り当てられます。 -
変数
localBlob
のデータ型はBLOB、変数localBfile
はBFILE、httpStatus
はNUMBER、およびlastModDate
は最大256文字のVARCHAR2です。
-
外側のBEGIN...END実行文部は、次の操作を実行します。
-
表
CW_IMAGES_TABLE
で、ID
列の値がMEDIA_ID
入力パラメータの値と一致するORDImageオブジェクト列IMAGE
を選択します。 -
内側の実行ブロックでデータが検出されない場合、例外が発生し、PL/SQL Gatewayの
resource_not_found
ファンクションをコールしてMEDIA_ID
入力パラメータの値を取得します。 -
ブラウザがIf-Modified-Sinceヘッダーを送信した場合、PL/SQL Gatewayの
cache_is_valid
ファンクションに渡されたgetUpdateTime( )メソッドをコールして、更新時刻を確認します。 -
キャッシュが有効である場合、PL/SQL Web Toolkitの
owa_util
パッケージのstatus_line
プロシージャを使用してhttp_status_not_modified
ファンクションへコールを渡し、HTTPステータス・コードをクライアントに送信します。 -
ORDImageのisLocal( )メソッドをコールして、イメージ・データが格納されている位置を判断します。このメソッドは、イメージ・データがBLOBでローカルに格納されている場合はtrueを戻します。この場合、ローカルのBLOBの処理を有効にします。
-
値がtrueの場合、変数
localBlob
にORDImageのgetContent( )メソッドを割り当て、イメージ・データを含むローカルのBLOBを操作できるようにします。 -
ORDImageのgetMimeType( )メソッドをコールして、イメージのMIMEタイプを判断し、このタイプを
owa_util.mime_header
プロシージャに渡してHTTPヘッダーをオープンしたままにします。 -
ORDImageのgetUpdateTime( )メソッドをコールして、イメージの最終変更時刻を取得し、その時刻を
ordplsgwyutil.set_last_modified
プロシージャに渡します。 -
owa_util.http_header_close( )
プロシージャをコールしてHTTPヘッダーをクローズします。 -
owa_util.get_cgi_env
プロシージャをコールし、リクエスト・メソッドの値がHEAD
でない場合、wpg_docload.download_file
プロシージャを使用して、イメージ・データを含むBLOBのLOBロケータを含むlocalBlob
の値を渡して、データベースからイメージをダウンロードします。
-
-
ORDImageのisLocal( )メソッドでfalseが戻された場合、ORDImageのgetSourceType( )メソッドをコールして、値が
FILE
であるかどうかを判断します。値がFILEである場合、イメージ・データはローカル・ファイル・システム上に外部ファイルとして格納されています。次に、イメージ・データを含むBFILEのLOBロケータを取得します。-
変数
localBfile
にORDImageのgetBfile( )メソッドを割り当て、イメージ・データを含むBFILEのLOBロケータを取得します。 -
ORDImageのgetMimeType( )メソッドをコールして、イメージのMIMEタイプを判断し、このタイプを
owa_util.mime_header
プロシージャに渡してHTTPヘッダーをオープンしたままにします。 -
ORDImageのgetUpdateTime( )メソッドをコールして、イメージの最終変更時刻を取得し、その時刻を
ordplsgwyutil.set_last_modified
プロシージャに渡します。 -
owa_util.http_header_close( )
プロシージャをコールしてHTTPヘッダーをクローズします。 -
owa_util.get_cgi_env
プロシージャをコールし、リクエスト・メソッドの値がHEAD
でない場合、wpg_docload.download_file
プロシージャを使用して、イメージ・データを含むBFILEのLOBロケータを含むlocalBfile
の値を渡して、ファイルからイメージをダウンロードします。
-
-
ORDImageのisLocal( )メソッドでfalseが戻された場合、ORDImageのgetSourceType( )メソッドをコールして、値が
HTTP
であるかどうかを判断します。値がHTTPである場合、イメージ・データはHTTP URLで示される場所に格納されています。この場合、owa_util.redirect_url
プロシージャを使用して、ORDSourceが提供したURLにクライアントをリダイレクトします。 -
ORDImageのisLocal( )メソッドでfalseが戻された場合、ORDImageのgetSourceType( )メソッドをコールして、値が
FILE
またはHTTP
であるかどうかを判断します。値がどちらでもない場合、イメージは、Oracle Multimediaで認識またはサポートされないアプリケーション固有のデータ・ソース・タイプとして格納されています。
-
-
関連項目:
セキュア・パスワードの作成の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください
4.4 Oracle Multimedia Code Wizardの既知の制限事項
Code Wizardでは、Oracle Multimediaの機能がサポートされますが、既知の制限事項がいくつかあります。
Oracle Multimedia Code Wizardでは、次の制限事項が報告されています。
-
複合主キーを含む表はサポートされません。
複合主キーを含む表を使用するには、アップロード・プロシージャまたはダウンロード・プロシージャを作成し、生成されたソースを、すべての主キー列をサポートするように編集します。たとえば、メディアの取得プロシージャの場合、パラメータを追加して、そのパラメータをSELECT文の
where
句に指定する必要があります。 -
埋込みOracle Multimediaオブジェクト型を含むユーザー定義のオブジェクト型は、Oracle Multimedia Code Wizardでは認識されません。