この章では、Oracle Multimedia Code Wizardサンプル・アプリケーションについて説明します。PL/SQL Gateway用のOracle Multimedia Code Wizardサンプル・アプリケーションは、Oracle Multimediaのイメージ、オーディオ、ビデオおよび異機種間メディア・オブジェクト型を使用して、メディアをアップロードおよび取得するWebアプリケーションです。
この章では、次のことを想定しています。
PL/SQL Gatewayを使用したPL/SQLアプリケーションの開発に精通している。
Oracle Multimedia Code Wizardサンプル・アプリケーションをインストールおよび構成している。
サンプル・アプリケーション・ファイルおよびREADME.txtファイルは次のディレクトリにあります。
<ORACLE_HOME>/ord/http/demo/plsgwycw(LinuxおよびUNIXの場合)
<ORACLE_HOME>\ord\http\demo\plsgwycw(Windowsの場合)
次の項では、Code Wizardフォト・アルバム・アプリケーションの実行方法について説明します。このサンプル・アプリケーションをインストールおよび構成する場合の追加要件および手順については、README.txtファイルを参照してください。Oracle Multimedia IMExampleサンプル・アプリケーションの詳細は、第5章を参照してください。このサンプル・アプリケーションでは、Oracle Multimedia Java ClassesとOracle Multimediaオブジェクト型を使用して、Oracle Databaseのサンプル・スキーマからマルチメディア・データを取得、保存、再生および削除することができます。
次のフォト・アルバム・サンプル・アプリケーションの詳細は、第3章を参照してください。
Oracle Multimedia PL/SQL Web Toolkitフォト・アルバム・アプリケーション
Oracle Multimedia Javaサーブレット・フォト・アルバム・アプリケーション
Oracle Multimedia JSPフォト・アルバム・アプリケーション
Oracle Multimedia ASP/VBScriptフォト・アルバム・アプリケーション
この一連のWebアプリケーションでは、PL/SQLスクリプト、Javaサーブレット・ファイル、JSPファイルおよびASP/VBScriptファイルを使用して、Oracle Multimediaオブジェクト型でメディアをアップロードおよび取得する様々な方法を示します。
Oracle Multimedia Code Wizardサンプル・アプリケーションは、PL/SQL Gateway用のPL/SQLストアド・プロシージャを作成し、Oracle Multimediaオブジェクト型のORDImage、ORDAudio、ORDVideo、ORDDoc、および各オブジェクトのメソッドを使用して、データベースに格納されたメディア・データ(イメージ、オーディオ、ビデオおよび一般的なメディア)をアップロードおよび取得する方法を示すサンプル・アプリケーションです。Code Wizardでは、表示される手順に従って、メディアの取得プロシージャまたはアップロード・プロシージャを作成できます。スタンドアロンのメディア・アクセス・プロシージャを作成してコンパイルするか、またはPL/SQLパッケージに含めるメディア・アクセス・プロシージャのソースを作成できます。これは、フォト・アルバム・アプリケーション(3.1項を参照)が、photo_albumPL/SQLパッケージ内のinsert_new_photoプロシージャをイメージ・アップロード・プロシージャとして、およびdeliver_mediaプロシージャをイメージ取得プロシージャとして使用する方法に類似しています。作成したメディア・アクセス・プロシージャは、必要に応じて特定のアプリケーション要件を満たすようにカスタマイズできます。
Oracle Multimedia Code Wizardサンプル・アプリケーションは、OTNからダウンロード可能なOracle Database Examplesのメディアからインストールできます。アプリケーションは、次のディレクトリにインストールされます。
<ORACLE_HOME>/ord/http/demo/plsgwycw
このディレクトリにあるREADME.txtファイルには、Code Wizardサンプル・アプリケーションのインストールおよび構成についての説明がすべて含まれています。次の説明は、Code WizardがORDSYSスキーマにインストールされていることを前提としています。
Code Wizardを使用してメディアのアップロード・プロシージャおよび取得プロシージャを作成およびテストするには、次の手順を実行します。
Code Wizardで使用する、新しいデータベース・アクセス記述子(DAD)を作成するか、または既存のDADを選択します。
Code Wizardの管理機能を使用して、DADの使用を認可します。
メディアのアップロード・プロシージャおよび取得プロシージャを作成します。
この項では、前述の手順および関連する手順の詳細を説明します。
メディアのアップロード・プロシージャまたは取得プロシージャを作成するには、Code Wizardで使用するDADを1つ以上選択する必要があります。スキーマ表が不正に参照されたり、メディア・アクセス・プロシージャが不正に作成されることを防ぐために、Code Wizardの管理機能を使用して各DADを認可する必要があります。データベースおよびアプリケーションのセキュリティ要件に応じて、Code Wizard専用の新規DADを1つ以上作成して認可するか、または既存のDADの使用を認可します。
Code Wizardでの使用を認可したDADには、なんらかのユーザー認証方式を指定することをお薦めします。最も簡単な方法は、データベース認証を使用するDADを作成または使用することです。この方法を行うには、DAD仕様でBasic Authentication Modeを選択し、パスワードを空白のままにします。または、既存のアプリケーション固有の認証方式を指定したDADを使用することもできます。DADの構成の詳細は、Oracle Application Server JP Documentation Libraryの『Oracle HTTP Server管理者ガイド』を参照してください。次の例では、DADを作成して、SCOTTスキーマにメディアのアップロード・プロシージャおよび取得プロシージャを作成してテストする方法を示します。
|
注意: メディアのアップロード・プロシージャをテストするには、ドキュメント表の名前をDADに指定する必要があります。アップロード・プロシージャをテストする際は、そのプロシージャの作成に使用したDADを選択するか、またはアプリケーションへのアクセスに使用されるDADを使用できます。ドキュメント表の名前は、DADの作成時に選択するか、後でDADを編集して指定できます。またはドキュメント表の名前がすでに指定されている既存のDADを使用することもできます。次の例では、DADの作成時にドキュメント表の名前を指定します。 |
Webブラウザで、Oracle HTTP Serverのホームページを開きます。「Administration」ページで「PL/SQL Properties」を選択します。mod_plsqlサービス・ページが表示されます。
mod_plsqlサービス・ページで、DAD Statusセクションまでスクロールします。「Create」をクリックします。「DAD Type」ページが表示されます。
DAD typeに「General」を選択します。「Next」をクリックします。「Database Connection」ページが表示されます。
「DAD Name」フィールドに/scottwと入力します。データベース・アカウントにSCOTTと入力し、パスワードは空白にします。「Database Connectivity Information」セクションに、接続情報を入力します。「Default page」フィールドにORDCWPKG.MENUと入力します。他のフィールドは空白のままにします。「Next」をクリックします。「Document, Alias and Session」ページが表示されます。
「Document, Alias, and Session」ページで、「Document Table」にMEDIA_UPLOAD_TABLEと入力します。「Apply」をクリックします。
変更内容を有効にするために、Oracle HTTP Serverを再起動します。
DADをCode Wizardで使用するように認可するには、次の手順を実行します。
Code Wizardの管理URLを、ブラウザのアドレス・バーに入力します。次に例を示します。
http://<host-name>:<port-number>/ordcwadmin
ブラウザの表示に従って、ユーザー名ORDSYSおよびパスワードを入力します。
図4-1に示すとおり、「Main menu」で「DAD authorization」を選択します。その後、「Next」をクリックします。
図4-1 interMedia Code Wizard for the PL/SQL Gatewayのメイン・メニュー

図4-2に示すとおり、認可するDADの名前およびユーザー名を入力します。その後、「Apply」をクリックします。
|
注意: DADの重複は許可されません。また、各認可済DADには、そのDADを使用するCode Wizardでユーザーがアクセスすることを認可されているデータベース・スキーマが指定されている必要があります。Code Wizardで使用する必要がなくなった既存のDADの認可は、このページで削除してください。 |
図4-3に示すとおり、Oracle Multimedia Code Wizardでの使用を認可された更新後のDADの一覧を確認します。その後、「Next」をクリックします。
ログアウト(HTTP認証情報をクリア)するには、「Main menu」で「Logout」を選択し、「Next」をクリックします。ログアウト操作のリクエストが、PL/SQL Gatewayの組込みファンクションlogmeoffに送信されます。詳細は、『Oracle HTTP Server mod_plsqlユーザーズ・ガイド』を参照してください。
Code Wizardを起動するには、適切なURLを、ブラウザのアドレス・バーに入力します。次に例を示します。
http://<hostname>:<port-number>/scottcw
または
http://<hostname>:<port-number>/mediadad/ordcwpkg.menu
その後、ブラウザの表示に従って、ユーザー名およびパスワードを入力します。図4-4に示すとおり、Oracle Multimedia Code Wizard for the PL/SQL Gatewayの「Main menu」ページが表示されます。
DADがCode Wizard専用に構成されている場合、単にDAD名を入力します。別のDADを使用するには、DAD名の後に、Code Wizardパッケージ名とMain menuプロシージャ名(ORDCWPKG.MENU)を入力します。
ログイン後はいつでもログアウト(HTTP認証情報をクリア)できます。ログアウトするには、「Main menu」で「Logout」を選択し、「Next」をクリックします。ログアウト操作のリクエストが、PL/SQL Gatewayの組込みファンクションlogmeoffに送信されます。詳細は、『Oracle HTTP Server mod_plsqlユーザーズ・ガイド』を参照してください。
メディアのアップロード・プロシージャ(4.1.4項を参照)または取得プロシージャ(4.1.5項を参照)を作成するには、「Main menu」で適切なオプションを選択し、「Next」をクリックします。Code Wizardに表示される手順に従って、プロシージャを作成できます。
スタンドアロンのメディアのアップロード・プロシージャまたはメディアの取得プロシージャを作成する場合、プロシージャのコンテンツを表示およびテストできます。4.2項および4.3項に示すイメージおよびマルチメディアのサンプル・セッションでは、それぞれメディアのアップロード・プロシージャおよび取得プロシージャを作成およびテストする方法を示しています。
Oracle Multimedia Code Wizard for the PL/SQL Gatewayを使用してメディアのアップロード・プロシージャを作成するには、次の手順を実行します。
図4-5に示すとおり、「Main menu」で「Create media upload procedure」を選択します。その後、「Next」をクリックします。
図4-6に示すとおり、「Step 1: Select database table and procedure type」で「CW_IMAGES_TABLE」および「Standalone procedure」を選択します。その後、「Next」をクリックします。
図4-7および図4-8に示すとおり、「Step 2: Select PL/SQL Gateway document upload table」で「Use existing document table」および「MEDIA_UPLOAD_TABLE」を選択します。これは、SCOTTCW DADがこのドキュメントを使用するように構成されているためです。その後、「Next」をクリックします。
図4-9に示すとおり、「Step 3: Select data access and media column(s)」で「IMAGE (ORDIMAGE)」をチェックし、「ID (Primary key)」を選択して、「Conditional insert or update」を選択します。その後、「Next」をクリックします。
図4-10に示すとおり、「Step 4: Select additional columns and procedure name」で、「DESCRIPTION」をチェックし、デフォルトのプロシージャ名「UPLOAD_CW_IMAGES_TABLE_IMAGE」を受け入れて、「Create procedure in the database」を選択します。その後、「Next」をクリックします。
図4-11に示すとおり、「Step 5: Review selected options」で選択したオプションを確認します。正しいオプションが選択されている場合、「Finish」をクリックします。
図4-12に示すとおり、「Compile procedure and review generated source」ウィンドウにメッセージ「Procedure created successfully: UPLOAD_CW_IMAGES_TABLE_IMAGE」が表示されます。コンパイル済のPL/SQLソース・コードを別のウィンドウで確認するには、「View」をクリックします(生成されたアップロード・プロシージャは、4.2項の手順5を参照)。SCOTTCW DADを構成し、ドキュメント表にMEDIA_UPLOAD_TABLEを指定した場合、「DAD:」フィールドにデフォルトでDAD名scottcwが表示されます。作成したPL/SQLプロシージャをテストするには、「Test」をクリックします。
図4-13に示すとおり、「interMedia Code Wizard: Template Upload Form」ウィンドウで、「ID」フィールドに値1を入力し、「IMAGE」フィールドでアップロードするイメージを参照して選択し、アップロードするイメージの簡単な説明を「DESCRIPTION」フィールドに入力します。次に、「Upload media」をクリックします。
イメージが表の行にアップロードされ、図4-14に示すとおり、メッセージが表示されます。
図4-14 テンプレート・アップロード・プロシージャ: メディアのアップロード正常終了のメッセージ

「Compile procedure and review generated source」ウィンドウに戻ります。テストを終了する場合、「Done」をクリックして「Main menu」に戻ります。
Oracle Multimedia Code Wizard for the PL/SQL Gatewayを使用してメディアの取得プロシージャを作成するには、次の手順を実行します。
図4-15に示すとおり、「Main menu」で「Create media retrieval procedure」を選択します。その後、「Next」をクリックします。
図4-16に示すとおり、「Step 1: Select database table and procedure type」で「CW_IMAGES_TABLE」および「Standalone procedure」を選択します。その後、「Next」をクリックします。
図4-17に示すとおり、「Step 2: Select media column and key column」で「IMAGE (ORDIMAGE)」および「ID (Primary key)」を選択します。その後、「Next」をクリックします。
図4-18に示すとおり、「Step 3: Select procedure name and parameter name」で、デフォルトのプロシージャ名「GET_CW_IMAGES_TABLE_IMAGES」、デフォルトのパラメータ名「MEDIA_ID」および「Create procedure in the database」を受け入れます。その後、「Next」をクリックします。
図4-19に示すとおり、「Step 4: Review Selected Options」で選択したオプションを確認します。正しいオプションが選択されている場合、「Finish」をクリックします。
図4-20に示すとおり、「Compile procedure and review generated source」ウィンドウにメッセージ「Procedure created successfully: GET_CW_IMAGES_TABLE_IMAGE」が表示されます。コンパイル済のPL/SQLソース・コードを別のウィンドウで確認するには、「View」をクリックします(生成された取得プロシージャは、4.2項の手順6を参照)。作成したPL/SQLプロシージャをテストするには、ID値1を指定してイメージをデータベースにロードしている場合は、「Key parameter (MEDIA_ID)」に値1を入力し、「Test」をクリックします。イメージが表の行から取得され表示されます(図4-21を参照)。「Done」をクリックして「Main menu」に戻ります。
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 SecureFile LOBs
--
LOB(blob_content) STORE AS SECUREFILE;
ファイルのアップロードおよびドキュメント表の詳細は、『Oracle HTTP Server mod_plsqlユーザーズ・ガイド』を参照してください。
ブラウザで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ステータスを戻し、ブラウザにリソースを送信します。詳細は、HTTP仕様(http://www.w3.org/Protocols/)を参照してください。
ORDImage、ORDAudio、ORDVideoおよびORDDocのすべてのオブジェクトには、埋込みORDSourceオブジェクトにDATEとして格納されたupdateTime属性があります。DATEデータ型ではタイムゾーンまたは夏時間がサポートされませんが、Oracle9i以降のバージョンのデータベースはタイムゾーンをサポートし、データベースに格納されたDATE値をUTCに変換するファンクションも提供しています。データベースにタイムゾーンを設定する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。日時ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
ブラウザに最初のレスポンスが戻されると、メディアの取得プロシージャは、updateTime属性に基づいてLast-Modified HTTPレスポンス・ヘッダーを設定します。メディア・データのリクエストにIf-Modified-Sinceヘッダーが含まれている場合、メディアの取得プロシージャはその値とupdateTime属性を比較して、適切なレスポンスを戻します。ブラウザのキャッシュ内のリソースが有効である場合、HTTPの304 Not Modifiedステータスがレスポンス・ボディなしで戻されます。リソースが、ブラウザでキャッシュされた日時以降に変更されている場合、HTTPの200 OKステータス、およびメディア・リソースを含むレスポンス・ボディが戻されます。Code Wizardによって作成されたメディアの取得プロシージャは、データベースに格納されたDATE値をUTCに変換するユーティリティ・パッケージをコールします。このユーティリティ・パッケージは、Oracle9i以降のデータベースに格納されたタイムゾーン情報、および日時ファンクションを使用して、データベースの日時スタンプをUTCに変換します。前述のとおり、変換後の日付がLast-Modifiedの日時より前になるように、タイムゾーン情報を正確に指定する必要があります。データベースにタイムゾーンを設定する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。
次のサンプル・セッションでは、SCOTTスキーマを使用してイメージ・メディアのアップロード・プロシージャおよび取得プロシージャを作成する方法を示します。 別のスキーマを使用する場合は、そのスキーマの名前とパスワードを指定します。 また、SCOTTスキーマのパスワードを変更した場合は、その新しいパスワードを使用します。 セキュアなパスワードの作成方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
このサンプル・セッションでは、Oracle Multimedia Code WizardがORDSYSスキーマにインストールされていることを前提としています。
次の手順を実行します。
手順1 SQL*Plusの起動、データベース内のSCOTTスキーマ(または、他のスキーマ)への接続、およびアプリケーションのイメージを格納する表の作成
次に例を示します。
sqlplus SCOTT [@<connect_identifer>]
Enter password: password
SQL> CREATE TABLE cw_images_table( id NUMBER PRIMARY KEY,
description VARCHAR2(30) NOT NULL,
location VARCHAR2(30),
image ORDSYS.ORDIMAGE )
--
-- store media as SecureFile LOBs
--
LOB(image.source.localdata) STORE AS SECUREFILE;
手順2 プロシージャの作成に使用するSCOTTCW DADの作成
Webブラウザで、Oracle HTTP Serverのホームページを開きます。「Administration」ページで「PL/SQL Properties」を選択します。mod_plsqlサービス・ページが表示されます。
mod_plsqlサービス・ページで、DAD Statusセクションまでスクロールします。「Create」をクリックします。「DAD Type」ページが表示されます。
DAD typeに「General」を選択します。「Next」をクリックします。「Database Connection」ページが表示されます。
「DAD Name」フィールドに/scottwと入力します。データベース・アカウントにSCOTTと入力し、パスワードは空白にします。「Database Connectivity Information」セクションに、接続情報を入力します。「Default page」フィールドにORDCWPKG.MENUと入力します。他のフィールドは空白のままにします。「Next」をクリックします。「Document, Alias and Session」ページが表示されます。
「Document, Alias and Session」ページで、「Document Table」にMEDIA_UPLOAD_TABLEと入力します。「Apply」をクリックします。
変更内容を有効にするために、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 SCOTTCW DADへの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によって、「interMedia 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 interMedia 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 interMedia 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>interMedia Code Wizard: Template Upload
Procedure</title>' );
htp.print( '<body>' );
htp.print( '<h2><i>inter</i>Media 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つの入力パラメータが宣言され、in_IMAGEおよびin_DESCRIPTIONがNULLに初期化されます。
サブプログラム・セクションでは、次の変数が宣言されます。
変数local_IMAGEにはORDSYS.ORDIMAGEデータ型が割り当てられ、ORDIMAGE.init( )メソッドによって空のBLOBで初期化されます。
変数local_IDは、表CW_IMAGES_TABLEのID列と同じデータ型を取り、NULLに初期化されます。
追加の3つの変数upload_size、upload_mimetypeおよびupload_blobが宣言されます。これらの変数には、後で、イメージのBROBデータのコンテンツを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_TABLE」をクリックします。
「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で認識またはサポートされないアプリケーション固有のデータ・ソース・タイプとして格納されています。
次のサンプル・セッションでは、SCOTTスキーマを使用して、マルチメディア(複数のOracle Multimediaオブジェクト列)をアップロードするプロシージャおよび1つのメディアを取得するプロシージャを作成する方法を示します。 別のスキーマを使用する場合は、そのスキーマの名前とパスワードを指定します。 また、SCOTTスキーマのパスワードを変更した場合は、その新しいパスワードを使用します。 セキュアなパスワードの作成方法の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
このサンプル・セッションでは、Oracle Multimedia Code Wizardがインストールされていることを前提としています。
次の手順を実行します。
手順1 SQL*Plusの起動、データベース内のSCOTTスキーマ(または、他のスキーマ)への接続、およびアプリケーションのオーディオを格納する表の作成
次に例を示します。
sqlplus SCOTT [@<connect_identifer>]
Enter password: password
SQL> CREATE TABLE cw_media_table( id NUMBER PRIMARY KEY,
description VARCHAR2(30) NOT NULL,
location VARCHAR2(30),
image ORDSYS.ORDIMAGE,
thumb ORDSYS.ORDIMAGE,
audio ORDSYS.ORDAUDIO,
video ORDSYS.ORDVIDEO,
media ORDSYS.ORDDOC )
--
-- store media as SecureFile LOBs
--
LOB(image.source.localdata) STORE AS SECUREFILE
LOB(thumb.source.localdata) STORE AS SECUREFILE
LOB(audio.source.localdata) STORE AS SECUREFILE
LOB(video.source.localdata) STORE AS SECUREFILE
LOB(media.source.localdata) STORE AS SECUREFILE;
手順2 手順2で作成し、手順3で使用を認可したSCOTTW DADの使用
SCOTTW DADを作成してその使用を認可していない場合、この項の手順2および手順3を実行してからこの項の次の手順に進みます。
手順3 SCOTTCW DADへのDADの変更
Code Wizardの管理URLをブラウザのアドレス・バーに入力し、ブラウザの表示に従ってORDSYSユーザー名およびパスワードを入力します。次に例を示します。
http://<hostname>:<port-number>/ordcwadmin
Code Wizardの「Main menu」で「Change DAD」をクリックします。
「Change to SCOTTCW」が選択されていない場合はそれをクリックし、「Next」をクリックします。
ユーザー名とパスワードを求められたら、ユーザー名SCOTTおよびそのパスワードを入力し、「OK」をクリックします。
「Main menu」に、現行DADとしてSCOTTCW、現行スキーマとしてSCOTTが表示されます。
手順4 メディアのアップロード・プロシージャの作成およびテスト
「Main menu」で「Create media upload procedure」をクリックし、「Next」をクリックします。
データベース表およびプロシージャ・タイプを選択します。
「CW_MEDIA_TABLE」をクリックします。
「Standalone procedure」をクリックします。
「Next」をクリックします。
PL/SQLドキュメント・アップロード表を選択します。
SCOTTスキーマにドキュメント表が存在しない場合、Code Wizardにその旨を示すメッセージが表示されます。この場合、表示されているデフォルトの表名CW_MEDIA_UPLOAD_TABLEを受け入れて、「Next」をクリックします。
既存のドキュメント表にCW_MEDIA_UPLOAD_TABLEが含まれていない場合、「Create new document table」をクリックし、表示されているデフォルトの表名CW_MEDIA_UPLOAD_TABLEを受け入れて、「Next」をクリックします。
CW_MEDIA_UPLOAD_TABLEドキュメント表が存在する場合、「Use existing document table」および「CW_MEDIA_UPLOAD_TABLE」を選択して、「Next」をクリックします。
データ・アクセスおよびメディア列を選択します。
「IMAGE (ORDIMAGE)」、「THUMB (ORDIMAGE) 」、「AUDIO (ORDAUDIO)」、「VIDEO (ORDVIDEO)」および「MEDIA (ORDDOC)」のすべてがチェックされていることを確認します。
「ID (Primary key)」をクリックします。
「Conditional insert or update」をクリックします。
「Next」をクリックします。
追加の列およびプロシージャ名を選択します。
DESCRIPTION列にはNOT NULL制約が定義されているため、「DESCRIPTION」がチェックされていることを確認します。(LOCATION列には制約がないため、デフォルトではチェックされていません。)
表示されているプロシージャ名「UPLOAD_CW_MEDIA_TABLE_IMAGE」を受け入れます。
「Create procedure in the database」をクリックします。
「Next」をクリックします。
選択したプロシージャ作成オプションを確認します。次のとおり表示されます。
Procedure type: Standalone
Table name: CW_MEDIA_TABLE
Media column(s): IMAGE (ORDIMAGE)
THUMB (ORDIMAGE)
AUDIO (ORDAUDIO)
VIDEO (ORDVIDEO)
MEDIA (ORDDOC)
Key column: ID
Additional column(s): DESCRIPTION
Table access mode: Conditional update or insert
Procedure name: UPLOAD_CW_MEDIA_TABLE_IMAGE
Function: Create procedure in the database
「Finish」をクリックします。
プロシージャをコンパイルし、生成されたソース情報を確認します。
Code Wizardに、メッセージ「Procedure created successfully: UPLOAD_CW_MEDIA_TABLE_IMAGE」が表示されます。
オプションの「Click to display generated source:」で「View」をクリックし、生成されたソースを別のウィンドウに表示します。生成されたソースを、手順4の6gの最後に示します。
生成されたソースを確認したら、ウィンドウを閉じます。
「DAD:」に表示されている「SCOTTCW」を受け入れて、「Test」をクリックします。生成されたプロシージャのテストに使用するテンプレート・ファイル・アップロード・フォームが別のウィンドウに表示されます。
テンプレート・ファイル・アップロード・フォームをカスタマイズするには、ブラウザの「ファイル」プルダウン・メニューから「名前をつけて保存」を選択します。
テンプレート・ファイル・アップロード・フォームをテストするには、次の情報を入力します。
ID列用に、行の主キーとして数値1を入力します。
各Oracle Multimediaオブジェクト列用に、「Browse...」をクリックして、表の各列にアップロードする適切なメディアを選択します。テストする列は、1つ以上またはすべての列を選択できます。
DESCRIPTION列用に、イメージの簡単な説明を入力します。
「Upload media」をクリックします。
Code Wizardによって、「interMedia 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_MEDIA_TABLE_IMAGE
( in_ID IN VARCHAR2,
in_IMAGE IN VARCHAR2 DEFAULT NULL,
in_THUMB IN VARCHAR2 DEFAULT NULL,
in_AUDIO IN VARCHAR2 DEFAULT NULL,
in_VIDEO IN VARCHAR2 DEFAULT NULL,
in_MEDIA IN VARCHAR2 DEFAULT NULL,
in_DESCRIPTION IN VARCHAR2 DEFAULT NULL )
AS
local_IMAGE ORDSYS.ORDIMAGE := ORDSYS.ORDIMAGE.init();
local_THUMB ORDSYS.ORDIMAGE := ORDSYS.ORDIMAGE.init();
local_AUDIO ORDSYS.ORDAUDIO := ORDSYS.ORDAUDIO.init();
local_AUDIO_ctx RAW( 64 );
local_VIDEO ORDSYS.ORDVIDEO := ORDSYS.ORDVIDEO.init();
local_VIDEO_ctx RAW( 64 );
local_MEDIA ORDSYS.ORDDOC := ORDSYS.ORDDOC.init();
local_MEDIA_ctx RAW( 64 );
local_ID CW_MEDIA_TABLE.ID%TYPE := NULL;
upload_size INTEGER;
upload_mimetype VARCHAR2( 128 );
upload_blob BLOB;
BEGIN
--
-- Update the existing row.
--
UPDATE CW_MEDIA_TABLE mtbl
SET mtbl.IMAGE = local_IMAGE,
mtbl.THUMB = local_THUMB,
mtbl.AUDIO = local_AUDIO,
mtbl.VIDEO = local_VIDEO,
mtbl.MEDIA = local_MEDIA,
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 a new row into the table.
--
INSERT INTO CW_MEDIA_TABLE ( ID, IMAGE, THUMB, AUDIO, VIDEO, MEDIA,
DESCRIPTION )
VALUES ( in_ID, local_IMAGE, local_THUMB, local_AUDIO,
local_VIDEO, local_MEDIA, in_DESCRIPTION );
END IF;
--
-- Select interMedia object(s) for update.
--
SELECT mtbl.IMAGE, mtbl.THUMB, mtbl.AUDIO, mtbl.VIDEO, mtbl.MEDIA INTO
local_IMAGE, local_THUMB, local_AUDIO, local_VIDEO, local_MEDIA
FROM CW_MEDIA_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 MEDIA_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 MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_IMAGE;
END IF;
--
-- Store media data for the column in_THUMB.
--
IF in_THUMB IS NOT NULL
THEN
SELECT dtbl.doc_size, dtbl.mime_type, dtbl.blob_content INTO
upload_size, upload_mimetype, upload_blob
FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_THUMB;
IF upload_size > 0
THEN
dbms_lob.copy( local_THUMB.source.localData,
upload_blob,
upload_size );
local_THUMB.setLocal();
BEGIN
local_THUMB.setProperties();
EXCEPTION
WHEN OTHERS THEN
local_THUMB.contentLength := upload_size;
local_THUMB.mimeType := upload_mimetype;
END;
END IF;
DELETE FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_THUMB;
END IF;
--
-- Store media data for the column in_AUDIO.
--
IF in_AUDIO IS NOT NULL
THEN
SELECT dtbl.doc_size, dtbl.mime_type, dtbl.blob_content INTO
upload_size, upload_mimetype, upload_blob
FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_AUDIO;
IF upload_size > 0
THEN
dbms_lob.copy( local_AUDIO.source.localData,
upload_blob,
upload_size );
local_AUDIO.setLocal();
BEGIN
local_AUDIO.setProperties(local_AUDIO_ctx);
EXCEPTION
WHEN OTHERS THEN
local_AUDIO.mimeType := upload_mimetype;
END;
END IF;
DELETE FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_AUDIO;
END IF;
--
-- Store media data for the column in_VIDEO.
--
IF in_VIDEO IS NOT NULL
THEN
SELECT dtbl.doc_size, dtbl.mime_type, dtbl.blob_content INTO
upload_size, upload_mimetype, upload_blob
FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_VIDEO;
IF upload_size > 0
THEN
dbms_lob.copy( local_VIDEO.source.localData,
upload_blob,
upload_size );
local_VIDEO.setLocal();
BEGIN
local_VIDEO.setProperties(local_VIDEO_ctx);
EXCEPTION
WHEN OTHERS THEN
local_VIDEO.mimeType := upload_mimetype;
END;
END IF;
DELETE FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_VIDEO;
END IF;
--
-- Store media data for the column in_MEDIA.
--
IF in_MEDIA IS NOT NULL
THEN
SELECT dtbl.doc_size, dtbl.mime_type, dtbl.blob_content INTO
upload_size, upload_mimetype, upload_blob
FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_MEDIA;
IF upload_size > 0
THEN
dbms_lob.copy( local_MEDIA.source.localData,
upload_blob,
upload_size );
local_MEDIA.setLocal();
BEGIN
local_MEDIA.setProperties(local_MEDIA_ctx, FALSE);
EXCEPTION
WHEN OTHERS THEN
local_MEDIA.contentLength := upload_size;
local_MEDIA.mimeType := upload_mimetype;
END;
END IF;
DELETE FROM MEDIA_UPLOAD_TABLE dtbl WHERE dtbl.name = in_MEDIA;
END IF;
--
-- Update interMedia objects in the table.
--
UPDATE CW_MEDIA_TABLE mtbl
SET mtbl.IMAGE = local_IMAGE,
mtbl.THUMB = local_THUMB,
mtbl.AUDIO = local_AUDIO,
mtbl.VIDEO = local_VIDEO,
mtbl.MEDIA = local_MEDIA
WHERE mtbl.ID = in_ID;
--
-- Display the template completion message.
--
htp.print( '<html>' );
htp.print( '<title>interMedia Code Wizard: Template Upload
Procedure</title>' );
htp.print( '<body>' );
htp.print( '<h2><i>inter</i>Media Code Wizard:
Template Upload Procedure</h2>' );
htp.print( 'Media uploaded successfully.' );
htp.print( '</body>' );
htp.print( '</html>' );
END UPLOAD_CW_MEDIA_TABLE_IMAGE;
このサンプル・マルチメディアのアップロード・プロシージャで宣言される入力パラメータおよび変数を次に示します。
このプロシージャの宣言部では、in_ID、in_IMAGE、in_THUMB、in_AUDIO、in_VIDEO、in_MEDIAおよびin_DESCRIPTIONの7つの入力パラメータが宣言され、先頭以外の6つのパラメータがNULLに初期化されます。
サブプログラム・セクションでは、次の変数が宣言されます。
変数local_IMAGEおよびlocal_THUMBにはORDSYS.ORDIMAGEデータ型が割り当てられ、ORDIMAGE.init( )メソッドによって空のBLOBで初期化されます。
変数local_AUDIOにはORDSYS.ORDAUDIOデータ型が割り当てられ、ORDAUDIO.init( )メソッドによって空のBLOBで初期化されます。また、コンテキスト変数local_AUDIO_ctxには、RAW(64)データ型が割り当てられます。
変数local_VIDEOにはORDSYS.ORDVIDEOデータ型が割り当てられ、ORDVIDEO.init( )メソッドによって空のBLOBで初期化されます。また、コンテキスト変数local_VIDEO_ctxには、RAW(64)データ型が割り当てられます。
変数local_MEDIAにはORDSYS.ORDDOCデータ型が割り当てられ、ORDDOC.init( )メソッドによって空のBLOBで初期化されます。また、コンテキスト変数local_MEDIA_ctxには、RAW(64)データ型が割り当てられます。
変数local_IDは、表CW_MEDIA_TABLEのID列と同じデータ型を取り、NULLに初期化されます。
追加の3つの変数upload_size、upload_mimetypeおよびupload_blobが宣言されます。これらの変数には、後で、SELECT文によってドキュメント表MEDIA_UPLOAD_TABLEの対応する列doc_size、mime_typeおよびblob_contentから値が割り当てられます。この操作は、イメージ、縮小イメージ、オーディオ、ビデオおよびメディアのBLOBデータのコンテンツを、それぞれORDSYS.ORDIMAGE.source.localData、ORDSYS.ORDIMAGE.source.localData、ORDSYS.ORDAUDIO.source.localData、ORDSYS.ORDVIDEO.source.localDataおよびORDSYS.ORDDOC.source.localData属性にコピーするための準備として実行されます。
外側のBEGIN...END実行文部は、次の操作を実行します。
表CW_MEDIA_TABLEで、既存の行のIMAGE列、THUMB列、AUDIO列、VIDEO列、MEDIA列およびDESCRIPTION列を更新し、ID列の値がin_ID入力パラメータの値と一致するlocal_IDの値を戻します。
戻されたlocal_IDの値がNULLである場合、条件付きで新しい行を表CW_MEDIA_TABLEに挿入し、IMAGE列内のORDImageオブジェクト型のインスタンス、THUMB列内のORDImageオブジェクト型のインスタンス、AUDIO列内のORDAudioオブジェクト型のインスタンス、VIDEO列内のORDVideoオブジェクト型のインスタンスおよびMEDIA列内のORDDocオブジェクト型のインスタンスを、それぞれ空のBLOBで初期化します。
表CW_MEDIA_TABLEで、ID列の値がin_ID入力パラメータの値と一致するORDImageオブジェクト列IMAGE、ORDImageオブジェクト列THUMB、ORDAudioオブジェクト列AUDIO、ORDVideoオブジェクト列VIDEOおよびORDDocオブジェクト列MEDIAを更新対象として選択します。
ドキュメント表で、Name列の値がin_IMAGE、in_THUMB、in_AUDIO、in_VIDEOまたはin_MEDIAのいずれかの入力パラメータの値と一致する行を選択し、その行のdoc_size、mime_typeおよびblob_content列の値をupload_size、upload_mimetypeおよびupload_blob変数に渡します。
DBMS_LOBによって、BLOBデータを表MEDIA_UPLOAD_TABLEからORDSYS.ORDIMAGE.source.localData、ORDSYS.ORDIMAGE.source.localData、ORDSYS.ORDAUDIO.source.localData、ORDSYS.ORDVIDEO.source.localDataおよびORDSYS.ORDDoc.source.localData属性にコピーし、setLocal( )メソッドをコールしてイメージ、オーディオおよびビデオ・データがBLOBでローカルに格納されていることを示し、ORDImage、ORDAudio、ORDVideoおよびORDDocのメソッドはsource.localData属性内で対応するデータを検索する必要があることを示します。
内側の実行ブロックでは、対応するORDImage、ORDAudio、ORDVideoおよびORDDocのsetProperties( )メソッドをコールして、イメージ、オーディオおよびビデオ・データを読み取り、オブジェクトの属性値を取得し、それらの値をORDImage、ORDAudio、ORDVideoおよびORDDocオブジェクトのイメージ、オーディオ、ビデオおよびメディア・オブジェクト属性にそれぞれ格納します。
setProperties( )コールが正常に実行されなかった場合、例外を捕捉し、contentLength( )メソッドをコールしてメディア・データのサイズを取得し、mimeType( )メソッドをコールしてメディア・データのMIMEタイプを取得します。
表CW_MEDIA_TABLEで、Name列の値がそれぞれ対応するin_IMAGE、in_THUMB、in_AUDIO、in_VIDEOおよびin_MEDIA入力パラメータの値と一致する行にコピーされたデータを含む行を、ドキュメント表MEDIA_UPLOAD_TABLEから削除します。
表CW_MEDIA_TABLEで、ID列の値がin_ID入力パラメータの値と一致するORDImageオブジェクト列IMAGE、ORDImageオブジェクト列THUMB、ORDAudioオブジェクト列AUDIO、ORDVideoオブジェクト列VIDEOおよびORDDocオブジェクト列MEDIAを、変数local_IMAGE、local_THUMB、local_AUDIO、local_VIDEOおよびlocal_MEDIAの内容でそれぞれ更新します。
PL/SQL Web Toolkitのhtp.printファンクションを使用して、メディアが正常にアップロードされた旨を示す完了メッセージをHTMLページに表示します。
手順5 メディアの取得プロシージャの作成およびテスト
「Main menu」で「Create media retrieval procedure」を選択し、「Next」をクリックします。
データベース表およびプロシージャ・タイプを選択します。
「CW_MEDIA_TABLE」をクリックします。
「Standalone procedure」をクリックします。
「Next」をクリックします。
メディア列およびキー列を選択します。
表示されるオブジェクト列のうちの1つが選択されていることを確認します。たとえば、手順4の6eでメディア・データをメディア列にロードした場合、MEDIA (ORDDOC)列を選択します。
「ID (Primary key)」をクリックします。
「Next」をクリックします。
プロシージャ名およびパラメータ名を選択します。
表示されているプロシージャ名「GET_CW_MEDIA_TABLE_IMAGE」を受け入れます。
表示されているパラメータ名「MEDIA_ID」を受け入れます。
「Create procedure in the database」をクリックします。
「Next」をクリックします。
選択したプロシージャ作成オプションを確認します。次のとおり表示されます。
Procedure type: Standalone Table name: CW_MEDIA_TABLE Key column: ID Media column: IMAGE (ORDDOC) Procedure name: GET_CW_MEDIA_TABLE_IMAGE Parameter name: MEDIA_ID Function: Create procedure in the database
「Finish」をクリックします。
プロシージャをコンパイルし、生成されたソースを確認します。
Code Wizardに、メッセージ「Procedure created successfully: GET_CW_MEDIA_TABLE_IMAGE」が表示されます。
「View」をクリックして、生成されたソースを別のウィンドウに表示します。生成されたソースを確認したら、ウィンドウを閉じます。生成されたソースを、この手順の最後に示します。
GET_CW_MEDIA_TABLE_IMAGEプロシージャを使用したイメージの取得に使用するURL形式を確認します。
「Key parameter」に数値1を入力し、「Test」をクリックして、前にアップロードしたイメージを取得することでプロシージャをテストします。
取得されたイメージが別のウィンドウに表示されます。
ウィンドウを閉じます。
「Done」をクリックして「Main menu」に戻ります。
|
注意: 生成されたメディアの取得スクリプトは、手順4の最後に示すマルチメディアのアップロード・スクリプトとは異なり、特定のOracle Multimediaオブジェクト型に対応するメディア・データ・タイプのみを処理できます。他のOracle Multimediaオブジェクト型に格納されたメディア・データを取得するには、必要なタイプのメディア・データの取得スクリプトを生成し、PL/SQLパッケージに追加してください。 |
生成されたメディアの取得プロシージャを次に示します。
CREATE OR REPLACE PROCEDURE GET_CW_MEDIA_TABLE_MEDIA ( MEDIA_ID
IN VARCHAR2 )
AS
localObject ORDSYS.ORDDOC;
localBlob BLOB;
localBfile BFILE;
httpStatus NUMBER;
lastModDate VARCHAR2(256);
BEGIN
--
-- Retrieve the object from the database into a local object.
--
BEGIN
SELECT mtbl.MEDIA INTO localObject FROM CW_MEDIA_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_MEDIA_TABLE_MEDIA;
4.2項の手順6の5eに記載した、生成されたイメージ取得プロシージャの末尾にある説明を参照してください。これらの2つの取得プロシージャの違いは、取得されるオブジェクト型が、一方はORDImageオブジェクト型で、他方はORDDocオブジェクト型であることのみです。
Oracle Multimedia Code Wizardでは、次の制限事項が報告されています。
複合主キーを含む表はサポートされません。
複合主キーを含む表を使用するには、アップロード・プロシージャまたはダウンロード・プロシージャを作成し、生成されたソースを、すべての主キー列をサポートするように編集します。たとえば、メディアの取得プロシージャの場合、パラメータを追加して、そのパラメータをSELECT文のwhere句に指定する必要があります。
埋込みOracle Multimediaオブジェクト型を含むユーザー定義のオブジェクト型は、Oracle Multimedia Code Wizardでは認識されません。