この章では、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_album
PL/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では認識されません。