2 Oracle Multimediaのアプリケーション開発

Oracle Multimediaでは、従来のクライアント/サーバーまたは2層アプリケーション、あるいは複数層アプリケーションを開発できます。どの方法でも、アプリケーション・サーバー層で実行するWebアプリケーションをデプロイし、Oracle Databaseと緊密に統合し、ユーザーがWebブラウザを通じてデスクトップからアプリケーションにアクセスできるようにすることができます。

ユーザーがスタンドアロン・クライアント・インタフェースまたはWebブラウザを通じてアプリケーションと対話できる本番環境で使用するために本番品質のOracle Multimediaアプリケーションを作成できます。TCP/IP、HTTP、HTML、XML、XHTMLなどの規格に基づくWebアプリケーションでは、この機能は基礎となるテクノロジの迅速な開発により促進されます。主要なソフトウェア・コンポーネントはより緊密に統合されるため、Webアプリケーションを設計、作成および管理する開発者のタスクは実装がより迅速、簡単かつシンプルになります。

マルチメディア・データでのアプリケーション開発には複数のツールと言語を使用できます。この章では、次の各項でこれらについて説明します。

関連項目:

2.1 SQL Developerを使用したマルチメディア・アプリケーションの開発

Oracle SQL Developerは、データベース・スキーマ・オブジェクトのスタンドアロン・グラフィカル参照およびデプロイメントを可能にするツールです。

Oracle SQL Developerは、BLOBおよびBFILEデータ型をサポートします。BLOBおよびBFILEにマルチメディア・データを格納する開発者は、マルチメディア・アプリケーションの開発にOracle SQL Developerを使用できます。

関連項目:

SQL DeveloperでのBLOBとBFILE、およびマルチメディア・データの使用の詳細は、Oracle SQL Developerユーザーズ・ガイドを参照してください。

2.2 Application Expressを使用したマルチメディア・アプリケーションの開発

Oracle Application Expressは、Oracle Database上のWebアプリケーションを迅速に開発するためのツールです。

ユーザー・インタフェース・テーマ、ナビゲーショナル・コントロール、フォーム・ハンドラ、フレキシブル・レポートなどの組込み機能により、Oracle Application Expressのユーザーは、アプリケーション開発プロセスを迅速化できます。

Oracle Application Expressは、BLOBおよびBFILEデータ型をサポートします。マルチメディア・データをBLOBまたはBFILEに格納する開発者は、アプリケーションを迅速に開発するためにOracle Application Expressを利用できます。

関連項目:

Oracle Application Expressでのマルチメディア・アプリケーションの構築の詳細は、Oracle Application Expressアプリケーション・ビルダー・ユーザーズ・ガイドを参照してください。

2.3 JavaおよびJDBCを使用したマルチメディア・アプリケーションの開発

Java Database Connectivity (JDBC)を使用すると、Oracle Multimediaでは、ユーザーが匿名PL/SQLコード・ブロックを埋め込んで、すべての層(クライアント、アプリケーション・サーバーまたはデータベース)で使用するJavaアプリケーションを迅速に開発して、データベースに格納されたオーディオ・データ、イメージ・データ、ビデオ・データまたは異機種間メディア・データを操作および変更できます。

次の各項では、JavaおよびJDBCを使用してマルチメディア・アプリケーションを開発する方法について説明します。

この項の例では、数値識別子(id)とバイナリ・ラージ・オブジェクト(BLOB)の2つの列にイメージ自体(image_blob)を保持する表を想定しています。

create table image_blob_table ( id number primary key, image_blob BLOB)
lob(image_blob) store as securefile;

関連項目:

2.3.1 Javaのための環境設定

このトピックでは、Oracle MultimediaでJavaを使用するための環境設定方法について説明します。

Oracle MultimediaをJavaとともに使用するには、Javaプログラムをコンパイルおよび実行するための環境を設定する必要があります。

次の手順を実行します。

  1. 環境変数CLASSPATHを指定し、この変数に、Oracle Multimedia機能とその他の必要な機能に適したOracle Javaアーカイブ(JAR)ファイルが含まれていることを確認します。

    次の表に、ファイルの名前とそのコンテンツ、そのファイルを必要とするOracle Multimedia機能またはその他の機能、JDKのバージョンの詳細、プラットフォーム、およびファイルを取得できる<ORACLE_HOME>ディレクトリ下のパス名を、Oracle JARごとに示します。

    表2-1 Oracle Multimedia用のJavaアーカイブ・ファイル

    Oracle JARファイルおよびコンテンツ これを必要とする機能 JDKバージョン、プラットフォームおよび場所

    名前: ordim.jar

    説明:

    Oracle Multimedia Javaプロキシ・クラス

    非推奨

    Multimedia Javaプロキシ・クラス

    BLOBおよびBFILEストリーミング

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/ordim.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>\ord\jlib\ordim.jar

    名前: ojdbc8.jar

    説明:

    Oracle JDBCライブラリ

    すべてのOracle Multimedia機能

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/jdbc/lib/ojdbc8.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>/jdbc/lib/ojdbc8.jar

    名前: xdb.jar

    説明:

    Oracle XDB Java Classesライブラリ

    DICOM機能

    Oracle Multimediaメタデータ抽出

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/rdbms/jlib/xdb.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>/rdbms/jlib/xdb.jar

    名前: xmlparserv2.jar

    説明:

    Oracle XML Parserライブラリ

    DICOM機能

    Oracle Multimediaメタデータ抽出

    複数層Java API機能

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/lib/xmlparserv2.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>\lib\xmlparserv2.jar

    名前: orddcmmt.jar

    説明:

    Oracle Multimedia中間層Javaクラス

    非推奨

    複数層Java API機能

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/orddcmmt.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>/ord/jlib/orddcmmt.jar

    名前: ordimdcm.jar

    説明:

    Oracle Multimedia DICOM Javaライブラリ

    非推奨

    複数層Java API機能

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/ordimdcm.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>\ord\jlib\ordimdcm.jar

    名前: orddicom.jar

    説明:

    Oracle Multimedia DICOM Javaプロキシ・クラス

    非推奨

    DICOM Javaプロキシ・クラス

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/orddicom.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>/ord/jlib/orddicom.jar

    名前: ordhttp.jar

    説明:

    Oracle Multimedia Servlets and JSP Java HTTPクラス

    非推奨

    JavaサーブレットおよびJavaServer Pages (JSP)アプリケーション

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/ord/jlib/ordhttp.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>\ord\jlib\ordhttp.jar

    名前: orai18n.jar

    説明:

    NLSキャラクタ・セット変換ライブラリ

    (省略可能)

    NLSキャラクタ・セットの変換

    JDK 8以降、LinuxおよびUNIX上:

    <ORACLE_HOME>/jlib/orai18n.jar

    JDK 8以降、Windows上:

    <ORACLE_HOME>\jlib\orai18n.jar

    クライアント・アプリケーションとデータベースとの間でNLSキャラクタ・セット変換が必要な場合は、CLASSPATH変数にorai18n.jarファイルを含める必要があります。NLSキャラクタ・セット変換が必要で、適切なライブラリが指定されていない場合、文字ベースのメタデータは16進エンコード文字列として返されることがあります。

    関連項目:

    NLSキャラクタ・セット変換の詳細は、『Oracle Database JDBC開発者ガイド』を参照してください。

    注意:

    JDBC OCIドライバを使用している場合は、次のいずれかの変数でJDBC OCI共有ライブラリの場所を指定します。

    • LD_LIBRARY_PATH (LinuxまたはUNIXの場合)

    • PATH (Windowsの場合)

    使用するプラットフォームに応じて、次に示す<ORACLE_HOME>ディレクトリ下のいずれかの場所に、JDBC OCI共有ライブラリがあります。

    • <ORACLE_HOME>/lib (LinuxおよびUNIX上のlibocijdbc12.soの場合)
    • <ORACLE_HOME>\bin (Windows上のocijdbc12.dllの場合)

    このライブラリ・パスは共有されるため、SQL*Plusなどの他のクライアント・アプリケーションを使用できるように、このライブラリ・パスがすでに指定されている場合があります。

  2. Javaプログラムに、次のインポート文を1つ以上追加します。

    java.sqlパッケージに含まれている標準のJDBCクラスの他に、Oracle JDBC拡張クラスoracle.jdbc.OracleResultSetを次の手順でインポートする必要があります。

    import oracle.jdbc.OracleResultSet;
    

    非推奨のOracle Multimedia Javaプロキシ・クラスを使用している場合は、処理するメディアのタイプに応じて次のimport文の1つ以上を追加する必要もあります。

    import oracle.ord.im.OrdAudio;
    import oracle.ord.im.OrdDoc;
    import oracle.ord.im.OrdImage;
    import oracle.ord.im.OrdVideo;

2.3.2 Javaでのメディアのアップロード

このトピックでは、Javaでマルチメディア・データをアップロードする方法を示す例を使用します。

次の例は、ファイル・システムからJavaアプリケーションのデータベースにマルチメディア・データをインポートする方法を示しています。

public void writeImageToDatabase(int id, String fileName )
            throws SQLException, IOException
                      {
       //Define the PL/SQL block to insert the new row.

       final String INSERT_BLOB = "DECLARE "
                    + "    src_id        NUMBER; "
                    + "BEGIN "
                    + "    src_id := ?;"
                    + "    DELETE FROM image_blob_table WHERE id=src_id; "
                    + "    INSERT INTO image_blob_table t (id, image_blob) "
                    + "           VALUES(src_id, empty_blob()) "
                    + "           RETURNING t.image_blob INTO ?; "
                    + "END;";
       try {

             //Create the statement object.
             final OracleCallableStatement pstmt =
                   (OracleCallableStatement)connection.prepareCall
                   (INSERT_BLOB);

             //Binding the variables to the statement.
             pstmt.setInt(1, id); //ID
             pstmt.registerOutParameter(2, OracleTypes.BLOB);
             pstmt.execute(); //Execute the PL/SQL statement.

             //Get the BLOB locator from the table.
             BLOB blob = pstmt.getBLOB(2);
             File binaryFile = new File(fileName);
             FileInputStream instream = new FileInputStream(binaryFile);

             //Retrieve the ideal buffer size to use in writing to the BLOB.
             int size = 1024*1024; // 1MB.
             byte[] buffer = new byte[size];
             int read = -1;
             long position =1;

             //Read the file to the byte array buffer, then write it to the BLOB.
             while ((read = instream.read(buffer)) != -1)

                {
                      blob.setBytes(position,buffer,0,read);
                      position+=read;
                }

                instream.close();
                connection.commit();


       } catch (FileNotFoundException e) {
               throw new FileNotFoundException("File " + fileName +" not Found.");
       } catch (IOException e) {
               throw new IOException("Error while reading " + fileName);

       }

           }

writeImageToDatabase( )をコールして行IDとソース・ファイル・パスを渡します。

//Write data from a local file into a BLOB in the database.
quickstart.writeImageToDatabase(1, "flowers.jpg");

注意:

接続時にautoCommitフラグがtrueに設定されているか、何も設定されていない場合(デフォルトはtrueです)、更新するBLOB列で行を選択しようとしたときに次のエラーが返されます。

java.sql.SQLException: ORA-22990: LOB locators cannot span transactions

次のようにしてautocommitフラグをfalseに設定できます。

conn.setautoCommit(false);

2.3.3 Javaでのイメージ・プロパティの取得

このトピックでは、Javaでイメージ・データのプロパティを取得する方法を示す例を使用します。

イメージ・データがファイル・システムから表image_blob_tableにインポートされた後、データベースはBLOB列image_blobのバイナリ・バイトが何を表すかを認識しません。次の例は、Oracle Multimedia PL/SQLパッケージのORDSYS.ORD_IMAGE.getProperties( )プロシージャを使用してイメージ・プロパティをJavaアプリケーションに抽出する方法を示しています。

public HashMap <String, Object> getProperties_example_j(int id )
       throws SQLException
  {
//Define the PL/SQL block to extract the properties.
final String getPropertiesStmt = "DECLARE "
         + "    src                         BLOB; "
         + "    img_mimeType                VARCHAR2(32); "
         + "    img_width                   INTEGER; "
         + "    img_height                  INTEGER; "
         + "    img_contentLength           INTEGER; "
         + "    img_fileFormat             VARCHAR2(32); "
         + "    img_contentFormat           VARCHAR2(32); "
         + "    img_compressionFormat      VARCHAR2(32); "
         + "BEGIN "
         + "    SELECT image_blob INTO src FROM image_blob_table"
         + "           WHERE id=?; "
         + "    ORDSYS.ORD_IMAGE.getProperties(src, "
         + "                  img_mimeType, "
         + "                  img_width, "
         + "                  img_height, "
         + "                  img_fileFormat, "
         + "                  img_compressionFormat, "
         + "                  img_contentFormat, "
         + "                  img_contentLength); "
         + "    ? := img_mimeType; "
         + "    ? := img_width; "
         + "    ? := img_height; "
         + "    ? := img_contentLength; "
         + "    ? := img_fileFormat; "
         + "    ? := img_contentFormat;"
         + "    ? := img_compressionFormat; "
         + "END;";

//Create the statement object.
final OracleCallableStatement pstmt =
     (OracleCallableStatement)connection.prepareCall(getPropertiesStmt);

//Binding the variables to the statement.
pstmt.setInt(1, id);
pstmt.registerOutParameter(2, OracleTypes.VARCHAR);
pstmt.registerOutParameter(3, OracleTypes.INTEGER);
pstmt.registerOutParameter(4, OracleTypes.INTEGER);
pstmt.registerOutParameter(5, OracleTypes.INTEGER);
pstmt.registerOutParameter(6, OracleTypes.VARCHAR);
pstmt.registerOutParameter(7, OracleTypes.VARCHAR);
pstmt.registerOutParameter(8, OracleTypes.VARCHAR);

//Execute the statement.
pstmt.execute();

//Create a HashMap object and populate it with the properties.
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("mimeType", pstmt.getString(2));
map.put("width", pstmt.getInt(3) );
map.put("height", pstmt.getInt(4));
map.put("contentLength", pstmt.getInt(5));
map.put("fileFormat", pstmt.getString(6));
map.put("contentFormat", pstmt.getString(7));
map.put("compressionFormat", pstmt.getString(8));

return map;
   }

idを渡してgetProperties_example_j( )をコールしてから、HashMapに対して繰り返してプロパティを出力します。

System.out.println("Original image properties");
       HashMap<String, Object> attributesMap= quickstart.getProperties_example_j(1);
       //Iterate over the HashMap.
       for (Map.Entry<String, Object> entry : attributesMap.entrySet()) {
              System.out.println(entry.getKey() + " = " + entry.getValue());
       }

注意:

image_blob列にあるイメージ・データがOracle Multimediaでサポートされるフォーマットでない場合(例: PSD)、次のエラーが返されます。

     Exception in thread "main" java.sql.SQLException: ORA-29400: data cartridge error

2.3.4 Javaでの縮小イメージの作成

このトピックでは、Javaで既存のイメージからサムネイル・イメージを生成する方法を示す例を使用します。

Oracle Multimedia ORD_IMAGE PL/SQLパッケージには、データベース内で起動できるいくつかのイメージ処理操作が含まれます。既存のイメージから縮小イメージを生成するには、Oracle Multimedia PL/SQLパッケージのORDSYS.ORD_IMAGE.thumbnail( )プロシージャを使用します。

次の例は、ソースBLOBから縮小イメージを作成する方法を示しています。

 public void thumbnail_example_j(int src_id, int dst_id ) throws SQLException
 {
      //Define the PL/SQL block to create a thumbnail.
      final String createThumbnailStmt  = "DECLARE "
               + "    src_blob      BLOB;"
               + "    dst_blob      BLOB;"
               + "    src_id        NUMBER;"
               + "    dst_id        NUMBER;"
               + "BEGIN"
               + "    src_id := ?;"
               + "    dst_id := ?;"
               + "    DELETE FROM image_blob_table WHERE id = dst_id;"
               + "    INSERT INTO image_blob_table(id, image_blob) "
               + "           VALUES (dst_id, empty_blob()) "
               + "           RETURNING image_blob INTO dst_blob;"
               + "    SELECT image_blob INTO src_blob FROM image_blob_table"
               + "           WHERE id = src_id;"
               + "    ORDSYS.ORD_IMAGE.thumbnail(src_blob,dst_blob);"
               + "    UPDATE image_blob_table SET image_blob = dst_blob"
               + "           WHERE id = dst_id; "
               + "END;";

      final OracleCallableStatement pstmt =
           (OracleCallableStatement)connection.prepareCall(createThumbnailStmt);

      //Binding the variables to the statement.
      pstmt.setInt(1, src_id);
      pstmt.setInt(2, dst_id);
      //Execute the statement.
      pstmt.execute();
      connection.commit();
 }

ソースと宛先のidを渡してthumbnail_example_j( )をコールします。

      //Create a thumbnail.
   quickstart.thumbnail_example_j(1,2);

2.3.5 JavaでのOracle Multimedia例外の処理

このトピックでは、コード例を使用して適切なエラー処理について説明します。これらの例では、いくつかの一般的なOracle Multimediaエラーおよびその他のタイプのエラーをJavaプログラムで処理する方法を示します。

実行時に発生する可能性があるエラーを、常にアプリケーションで処理する必要があります。これにより、実行時エラーが発生してもプログラムの動作を継続できます。また、プログラムの動作中に、ユーザーがエラーの原因を認識することもできるようになります。エラーを適切に処理することによって、可能であれば、アプリケーションの実行中に常にエラーからリカバリできます。さらに、適切にエラーを処理することで、必要な情報が提供されるため、常にエラーの原因を認識できます。

例外を処理する場合、Javaではtry/catchブロックを使用します。たとえば、Javaの場合、次のように例外を処理します。

try {
    //<some program logic>)
}
catch (exceptionName a) {
//Exception logic
}
finally {
//Execute logic if try block is executed even if an exception is caught
}

独自に設計、コーディングおよびデバッグしたアプリケーションであれば、プログラム内のどの箇所でエラーが発生してプログラムの処理が停止する可能性があるかがわかります。そのような箇所に対しては、発生する可能性のあるエラーを処理するための例外処理ブロックを追加する必要があります。

この項の例では、try/catchブロックを使用した例外処理について説明します。

次の各項では、Javaでの例外処理の詳細および例を示します。

関連項目:

2.3.5.1 Javaでの不明なイメージ・フォーマットのプロパティ設定

このトピックでは、Javaで不明なイメージ・フォーマットのプロパティを設定したときの例外を処理する方法を示します。

次のtry/catchブロックは、setProperties( )メソッドの例外の処理方法を示しています。

    try
    {
      img.setProperties();
      return true;
    }
    catch (SQLException e)
    {
      return false;
    }

例外が発生した場合、setProperties( )メソッドはfalseを戻します。それ以外の場合は、trueを戻します。

2.3.5.2 Javaでの不明なイメージ・フォーマットのイメージ処理

このトピックでは、Javaで不明なフォーマットのイメージを処理したときの例外を処理する方法を示します。

アプリケーションでイメージを処理する際にイメージ・フォーマットが不明な場合、processCopy( )メソッドがコールされると、アプリケーションは正常に実行されません。この潜在的な問題を回避するには、アプリケーションで、次のtry/catchブロックを使用して、SQLのすべての例外を捕捉します。

        try
        {
            image.processCopy( "maxScale=50,50", thumb );
        }
        catch ( SQLException e )
        {
            thumb.deleteContent();
            thumb.setContentLength( 0 );
        }

この例では、イメージ・フォーマットが不明で縮小イメージを作成できない場合に、アプリケーションによってSQL例外が捕捉され、deleteContent( )メソッドがコールされて縮小イメージのコンテンツが削除されます。次に、setContentLength( )メソッドがコールされて、コンテンツ長が0(ゼロ)に設定されます。

2.4 PL/SQLを使用したマルチメディア・アプリケーションの開発

Oracle Multimediaでは、ユーザーがPL/SQLアプリケーション・プログラミング・インタフェースを使用して、データベースに格納されているオーディオ、イメージおよびビデオ・データ、または異機種間メディア・データを操作するためのPL/SQLアプリケーションを開発できます。

PL/SQLは、SQLのデータ操作能力とプロシージャ言語のデータ処理能力が組み合された、完全に移植可能で高パフォーマンスのトランザクション処理言語です。

このトピックでは、PL/SQL Application Programming Interface (API)を使用したOracle Multimediaデータベース・オブジェクトの操作方法を簡単に説明します。データベースにメディアを格納する際に使用可能なOracle Multimediaオブジェクト型は、次のとおりです。

  • ORDAudio

  • ORDDicom

  • ORDDoc

  • ORDImage

  • ORDVideo

このトピックでは、主にOracle Multimediaのオブジェクト型について説明しますが、PL/SQL APIを使用して、BLOBまたはBFILEに直接格納されているマルチメディア・データを操作することもできます。次のOracle Multimedia PL/SQLパッケージは、データベース内のマルチメディア・データを操作するために使用できます。

  • ORD_AUDIO

  • ORD_DICOM

  • ORD_DOC

  • ORD_IMAGE

  • ORD_VIDEO

この項の例では、GitHubで入手できるOracle Databaseサンプル・スキーマを使用します。

次の各項では、PL/SQLを使用してマルチメディア・アプリケーションを開発する方法について説明します。

関連項目:

Oracle Multimedia PL/SQLパッケージおよびオブジェクト型の詳細は、『Oracle Multimediaリファレンス』を参照してください

2.4.1 PL/SQLのための環境設定

このトピックでは、Oracle MultimediaでPL/SQLを使用するための環境設定方法について説明します。

PL/SQLを使用してファイルにアクセスするには、データベース・サーバーがアクセス可能なディレクトリを指すディレクトリ・オブジェクトをデータベース上に作成する必要があります。たとえば、次のコマンドで、サンプル・スキーマに MEDIA_DIRディレクトリを作成します。

CREATE DIRECTORY MEDIA_DIR AS
    'c:\oracle\product\10.2.0\db_1\demo\schema\product_media';

データベースから取得したメディア・データをファイルに書き込むには、適切なユーザーに、指定したファイルへの書込み権限を付与する必要があります。例:

GRANT WRITE ON DIRECTORY MEDIA_DIR TO SCOTT;

ファイルからデータベースにメディア・データをアップロードするには、適切なユーザーに、指定したディレクトリへの読取り権限を付与する必要があります。次に例を示します。

GRANT READ ON DIRECTORY MEDIA_DIR TO SCOTT;

2.4.2 PL/SQLを使用したメディアのアップロード

このトピックでは、PL/SQLでマルチメディア・データをアップロードする方法を示す例を使用します。

メディアのアップロードは、メディア・データをファイル・システムからデータベースの表領域にインポートすることを指します。次に、一般的な手順を示します。

  1. 表に新しい行を挿入し、Oracle Multimediaオブジェクト型のオブジェクト・コンストラクタまたはinitメソッドを使用して新しいオブジェクトを作成します。
  2. Oracle Multimediaオブジェクトのインポート・メソッドをコールし、ファイル・システムのデータをデータベースにインポートします。
  3. Oracle MultimediaオブジェクトのsetPropertiesメソッドをコールし、オブジェクトの属性を判別および移入します。
  4. 表を更新し、前述の手順で抽出した属性値を表のOracle Multimediaオブジェクトに反映します。

次に、PM.ONLINE_MEDIA表に新しい行を挿入するPL/SQLコードの例を示します。

DECLARE
  img ORDImage;
  aud ORDAudio;
  vid ORDVideo;
  ctx RAW(64) := NULL;
BEGIN
  -- Insert a new row into the pm.online_media table.
  DELETE FROM pm.online_media WHERE product_id = 3003;
  INSERT INTO pm.online_media 
         (product_id, 
          product_photo, 
          product_audio,
          product_video)
  VALUES (3003, 
          ORDImage.init('FILE', 'MEDIA_DIR', 'laptop.jpg'),
          ORDAudio.init('FILE', 'MEDIA_DIR', 'laptop.mpa'),
          ORDVideo.init('FILE', 'MEDIA_DIR', 'laptop.rm'))
  RETURNING product_photo, product_audio, product_video
  INTO img, aud, vid;
  
  -- Bring the media into the database and populate the attributes.

    -- ORDImage.import also calls ORDImage.setProperties.
  img.import(ctx); 
  
  aud.import(ctx);
  aud.setProperties(ctx);
 
  vid.import(ctx);
  vid.setProperties(ctx);
    
  -- Update the table with the properties we have extracted.
  UPDATE pm.online_media
  SET    product_photo = img,
         product_audio = aud,
         product_video = vid
  WHERE  product_id = 3003;
  
  COMMIT;
END;
/

2.4.3 PL/SQLを使用したメディアへの問合せ

このトピックでは、PL/SQLでマルチメディア・データを問い合せる方法を示す例を使用します。

アクセッサ・メソッド(getHeight、getWidth、getMimeTypeなど)を使用することにより、標準のSQL問合せにメディア属性(高さ、幅、MIMEタイプなど)を含めることができます。これらのアクセッサ・メソッドを使用して、イメージ、オーディオおよびビデオ・オブジェクトに対して1つ以上の属性を問い合せる方法を、それぞれ例2-1例2-2および例2-3に示します。

例2-1 イメージ問合せ(高さ、幅およびMimeType属性)

SELECT t.product_id                  id,
       t.product_photo.getHeight()   height,
       t.product_photo.getWidth()    width,
       t.product_photo.getMimeType() mimetype
  FROM pm.online_media t;

例2-2 オーディオ問合せ(MimeType属性)

SELECT t.product_id                  id,
       t.product_audio.getMimeType() mimetype
  FROM pm.online_media t;

例2-3 ビデオ問合せ(MimeType属性)

SELECT t.product_id                  id,
       t.product_video.getMimeType() mimetype
  FROM pm.online_media t;

2.4.4 PL/SQLを使用したメディアのダウンロード

このトピックでは、PL/SQLでマルチメディア・データをダウンロードする方法を示す例を使用します。

データベースからファイル・システムのファイルへメディアをダウンロードするには、Oracle Multimediaオブジェクトのエクスポート・メソッドをコールします。次のコード例では、product_idが3117である行のイメージを、MEDIA_DIRディレクトリのファイル3117.jpgにエクスポートします。このコード例で、エクスポート操作を実行する部分を太字で強調表示しています。

DECLARE
  img ORDImage;
  ctx RAW(64) := NULL;
BEGIN
  SELECT  product_photo 
    INTO  img 
    FROM  pm.online_media
    WHERE product_id = 3117;
  img.export(ctx, 'FILE', 'MEDIA_DIR', '3117.jpg');
END;
/

2.4.5 PL/SQLでのOracle Multimedia例外の処理

このトピックでは、コード例を使用して適切なエラー処理について説明します。これらの例では、いくつかの一般的なOracle Multimediaエラーおよびその他のタイプのエラーをPL/SQLプログラムで処理する方法を示します。

実行時に発生する可能性があるエラーを、常にアプリケーションで処理する必要があります。これにより、実行時エラーが発生してもプログラムの動作を継続できます。また、プログラムの動作中に、ユーザーがエラーの原因を認識することもできるようになります。エラーを適切に処理することによって、可能であれば、アプリケーションの実行中に常にエラーからリカバリできます。さらに、適切にエラーを処理することで、必要な情報が提供されるため、常にエラーの原因を認識できます。

例外を処理する場合、PL/SQLでは例外ブロックを使用します。たとえば、PL/SQLの場合、次のように例外を処理します。

BEGIN
<some program logic>
EXCEPTION
     WHEN OTHERS THEN
     <some exception logic>
END;

独自に設計、コーディングおよびデバッグしたアプリケーションであれば、プログラム内のどの箇所でエラーが発生してプログラムの処理が停止する可能性があるかがわかります。そのような箇所に対しては、発生する可能性のあるエラーを処理するための例外処理ブロックを追加する必要があります。

これらの例は、「Oracle Multimedia PL/SQLフォト・アルバム・サンプル・アプリケーション」および「PL/SQL Gateway用のOracle Multimedia Code Wizardサンプル・アプリケーション」で説明しているPL/SQLサンプル・アプリケーションから抽出されています。

次の各項では、PL/SQLでの例外処理の詳細および例を示します。

2.4.5.1 PL/SQLでの不明なイメージ・フォーマットのプロパティ設定

このトピックでは、PL/SQLで不明なイメージ・フォーマットのプロパティを設定したときの例外を処理する方法を示します。

プログラムで、(イメージ・データを読み取って、適切な属性フィールドに格納できるようにオブジェクト属性の値を取得するために)アップロードされたイメージのプロパティを設定する際にイメージ・フォーマットを認識できない場合、setProperties( )メソッドが正常に実行されない場合があります。この例外を捕捉して潜在的な問題を回避するには、アプリケーションで、次の例外ブロックを使用します。

BEGIN
   new_image.setProperties();
EXCEPTION
   WHEN OTHERS THEN
         new_image.contentLength := upload_size;
         new_image.mimeType := upload_mime_type;
END;

この例では、例外ハンドラによって、insert_new_photoプロシージャの先頭に記述されているアップロード済の表から値が取得され、その値に基づいて、イメージのMIMEタイプおよびコンテンツ長が設定されます。ファイルがアップロードされると、ブラウザによってMIMEタイプ・ヘッダーが設定されます。アプリケーションは、このヘッダーを読み取り、ORDImageフィールドに設定します。

2.4.5.2 PL/SQLでの不明なイメージ・フォーマットのイメージ処理

このトピックでは、PL/SQLで不明なイメージ・フォーマットのプロパティを設定したときの例外を処理する方法を示します。

プログラムでイメージを処理する際にイメージ・フォーマットが不明な場合、processCopy( )メソッドは正常に実行されません。この潜在的な問題を回避するには、アプリケーションで、次の例外ブロックを使用します。

BEGIN
   new_image.processCopy( 'maxScale=50,50', new_thumb);
EXCEPTION
   WHEN OTHERS THEN
      new_thumb.deleteContent();
      new_thumb.contentLength := 0;
END;

このOracle Multimedia PL/SQL Web Toolkitフォト・アルバム・アプリケーションの例では、イメージ・フォーマットが不明で縮小イメージを作成できない場合に、例外ハンドラによって、縮小イメージのコンテンツが削除され、コンテンツ長が0(ゼロ)に設定されます。

2.5 PL/SQL Webアプリケーションの開発

PL/SQLでは、PL/SQL GatewayおよびPL/SQL Web Toolkitを使用してWebアプリケーションを開発できます。

注意:

PL/SQL GatewayおよびPL/SQL Web Toolkitの使用は、HTTP通信とHTMLの生成を厳しく制御する必要のあるアプリケーションに適しています。他のアプリケーションの場合、アプリケーション開発を容易にするためにより多くの機能や便利なグラフィカル・インタフェースを備えたOracle Application Expressを使用することを検討してください。

PL/SQLを使用してWebアプリケーションを開発するには、HTTPを介してWebブラウザと対話する一連のストアド・プロシージャで構成されるPL/SQLパッケージを開発します。ストアド・プロシージャは次の方法で実行できます。

  • クリックされるとストアド・プロシージャをコールするハイパーテキスト・リンクをクリックする。

  • HTMLページに表示されたフォームへの記入などのタスクの完了を示す、HTMLフォーム上の「Submit」をクリックする。

  • リストからのユーザーの選択に基づいて、ストアド・プロシージャにパラメータを渡す。

タグ付けされたHTMLテキストなどのストアド・プロシージャの情報は、WebページとしてWebブラウザに表示されます。これらの動的なWebページは、データベース・コンテンツおよびストアド・プロシージャに渡された入力パラメータに基づいて、データベースで生成されます。PL/SQLストアド・プロシージャは、特に動的なWebページ・コンテンツの生成に使用すると効率的かつ強力です。

イメージ、オーディオ、ビデオ、これら3つの組合せなどのメディア・データを、Oracle Multimedia PL/SQLパッケージのファンクションとプロシージャ、またはOracle Multimediaオブジェクト型およびそれぞれの一連のメソッドを使用してデータベース表にアップロードしたりデータベース表から取得する場合に、Oracle Multimediaを使用します。

メディア・アップロード・プロシージャは、最初にSQL INSERT操作を実行してメディア表にデータ行を挿入し、空のBLOBでそれぞれのマルチメディア列のインスタンスも初期化します。次に、SQL SELECT FOR UPDATE操作は更新するマルチメディア列を選択します。最後に、SQL UPDATE操作はマルチメディア列を更新します。Oracle Multimediaプロシージャまたはメソッドは、次のタスクを実行するためにコールされます。

  • 空のBLOBでマルチメディア列を初期化します。

  • Oracle Multimediaオブジェクト型を使用する際にメディア・データがBLOBに内部的に格納されることを示すように属性を設定します。

  • マルチメディア属性の値を取得し、それらを格納します。

  • BLOBのコンテンツ長およびそのMIMEタイプの判断(例外が発生した場合)。

メディアの取得操作では、次のタスクが実行されます。

  • データベースからのマルチメディア・データの取得

  • HTTPヘッダー時刻とは対照的に更新時刻に基づくマルチメディア・データのキャッシュ有効性のチェック

  • メディア・データが配置されている(データベース内、BFILE内またはURL位置での)場所の判断、メディアの取得、およびHTMLページに表示するメディアのダウンロード

関連項目:

2.5.1 PL/SQL GatewayおよびPL/SQL Web Toolkitの使用

mod_plsql Gateway (Oracle HTTP Serverのプラグイン)またはデータベース内のXML DB HTTPリスナーで実行されるPLSQL Gatewayの埋込みバージョンを使用して、ブラウザ・リクエストのリスニング、データベース内のストアドPL/SQLプロシージャの実行、および表示するためにWebブラウザに返されるレスポンスのデータとコードを含むHTMLページの生成を行うことができます。

Oracle HTTP Serverは主に、Webアプリケーションで使用され、通常はOracle HTTP Serverがインストールされているファイル・システムにある、静的HTMLファイルやイメージなどを処理します。Oracle HTTP Serverには、その機能を拡張するモジュールまたはプラグインが含まれます。Oracleで提供されるこれらのモジュールの1つは、PL/SQL Gatewayとも呼ばれるmod_plsqlモジュールです。PL/SQL Gatewayは、PL/SQLストアド・プロシージャをコールすることでデータベースからWebブラウザへのデータを動的に処理します。PL/SQL Gatewayは、PL/SQLストアド・プロシージャ・コールにマップされるリクエストをWebブラウザから受け取ります。PL/SQLストアド・プロシージャはデータベースからデータを取得し、PL/SQL Web Toolkitからのデータとコードを含むHTTPレスポンスを生成して、生成されたWebページをWebブラウザに表示します。PL/SQL Web Toolkitには、リクエストに関する情報を取得し、HTMLタグを作成し、クライアントWebブラウザにヘッダー情報を返すためにストアド・プロシージャで使用できるパッケージのセット(htphtfowaなど)が含まれます。

次の図は、これらの主要コンポーネント(Oracle HTTP Server、Webブラウザおよびデータベース)を示しています。

図2-1 PL/SQL Webアプリケーションのコンポーネント

図2-1の説明が続きます
「図2-1 PL/SQL Webアプリケーションのコンポーネント」の説明

前の図の番号は、クライアントWebブラウザ・リクエストがPL/SQLプロシージャからのWebページ・レスポンスにどのように変わるかを説明する手順を表しています。

  1. クライアントのWebブラウザが、PL/SQL Server PagesまたはサーブレットのリクエストをOracle HTTP Serverに送信します。
  2. Oracle HTTP Serverは、リクエストをPL/SQL Gateway(mod_plsql)にルーティングします。
  3. PL/SQL Gatewayが、データベース・アクセス記述子(DAD)に格納された構成情報を使用してデータベースにそのリクエストを転送し、データベースに接続します。
  4. PL/SQL Gatewayがコール・パラメータを準備し、アプリケーションのPL/SQLパッケージおよびPL/SQLストアド・プロシージャを起動します。
  5. PL/SQLプロシージャは、データベースのデータおよびデータベースからアクセスしたPL/SQL Web Toolkit内の特殊なパッケージを使用して、HTMLページを生成します。PL/SQL Web Toolkitには、リクエストに関する情報を取得し、HTMLタグを作成し、PL/SQL Gatewayに返されるレスポンスとしてクライアントWebブラウザにヘッダー情報を返すためにストアド・プロシージャで使用されるパッケージのセット(htphtfowaなど)が含まれます。
  6. PL/SQL GatewayがOracle HTTP Serverにレスポンスを送信します。
  7. Oracle HTTP Serverが、クライアントのWebブラウザに、フォーマットされたWebページとして表示するレスポンスを送信します。

例2-4 Webブラウザでmod_plsqlを起動するためのURLフォーマット

protocol://hostname[:port number]/DAD-name/[[!][schema name.]
 [package name.]procedure_name[?query_string]]

図2-5 フォト・アルバム・アプリケーションでmod_plsqlを起動するためのURLフォーマット

protocol://<hostname>[:<port-number>]/DAD-name/]procedure_name

通常、返されるフォーマットされたWebページには、1つ以上の追加リンクがあり、選択された各リンクはPL/SQL Gatewayを通じて別のリクエストをデータベースに送信して1つ以上のストアド・プロシージャを実行します。生成されたレスポンスは、通常は追加リンクとともにクライアントWebページに表示され、リンクが選択されると、別のフォーマットされたWebページとして表示するために生成されたレスポンスを返すなどのために他のストアド・プロシージャを実行します。

PL/SQL Gatewayを使用するWebアプリケーション開発者は、アプリケーションを構成するプロシージャとファンクションを説明するPL/SQLパッケージ仕様および本体を作成します。パッケージ仕様ではアプリケーションで使用されるプロシージャとファンクションを定義し、パッケージ本体は各プロシージャとファンクションの実装です。すべてのパッケージがコンパイルされてデータベースに格納され、データベース内のデータにアクセスし、Webページを表示するためのHTML出力をフォーマットするための特定の操作を実行します。

Oracle HTTP Serverは、ブラウザに入力されたURLを、データベースに格納された特定のPL/SQLプロシージャにマップします。各ストアド・プロシージャのDADに固有の構成情報を格納することでこれを行います。そのため、各DADには、Webサーバーがデータベース接続に入力されたURLを変換してストアド・プロシージャをコールするために必要とするデータベース接続情報が含まれます。

Oracle HTTP Serverがリクエストをリスニングし、そのリクエストをPL/SQL Gatewayにルーティングすると、PL/SQL Gatewayがデータベースにそのリクエストを転送します。DADに格納された構成情報の値によって、使用するデータベース別名、リモート・アクセスに使用する接続文字列、ドキュメントのアップロードまたはダウンロードに使用するプロシージャ、およびデータベースへのアクセスを許可するユーザー名とパスワード情報が決まります。ユーザーは、WebブラウザからPL/SQL Gatewayを起動するURLを指定します。URLには、DADの場所および実行するPL/SQLストアド・プロシージャの名前など、すべての必須およびオプションのパラメータを指定するフォーマットが定義されています(例2-4を参照)。

Oracle Multimediaフォト・アルバム・サンプル・アプリケーションおよびPL/SQL Web Toolkitを使用するには、URLを例2-5に示されている形式に簡略化します。

WebブラウザにURLを入力する際は、プロトコル(HTTPまたはHTTPS)、ホストWebサーバー名およびホストWebサーバーがリクエストをリスニングして処理するポート番号を含めます。次に、指定する仮想パスに/pls/<DAD-name>を含めてWebサーバーがmod_plsqlを起動するように構成されていること、およびWebサーバー上のDADの場所を示します。

例2-4では、最後の5つのパラメータに、感嘆符(!)文字、スキーマ名、パッケージ名、プロシージャ名および問合せ文字列が含まれます。構文の感嘆符、スキーマ名、パッケージ名および問合せ文字列パラメータはオプションです。プロシージャ名のみ必須です。

感嘆符は、柔軟なパラメータの引渡しが使用されていることを示します。スキーマ名を省略した場合、ユーザー名に基づいて解決されます。パッケージ名を省略した場合、プロシージャがスタンドアロンであることを意味します。問合せ文字列のパラメータはストアド・プロシージャ用であり、特殊なフォーマットで指定します。これらの5つのパラメータのうち、プロシージャ名はDADとURLの両方に指定する必要があります。他の4つのパラメータは、アプリケーションに応じてDADまたはURLのいずれか一方に指定します(あるいはどちらにも指定しません)。

URLを入力すると、指定したDADのホームページが表示されます。Webブラウザ・ページのアドレス・フィールドにURLを入力すると、指定したDADの場所のみ、指定したDADの場所とプロシージャ名、または指定したDADの場所とschema.package.procedure名のいずれかが起動されます。レスポンスはHTMLページとして戻されます。HTMLページには、リクエストされたデータおよびクライアントのWebブラウザに表示される他の指定コードが含まれます。Code Wizardでは、この操作がどのように機能するかが示されます。たとえば、Code Wizardの管理URLを起動するには、次のURLを入力します。

http://<hostname>:<port-number>/pls/ordcwadmin

仮想パスにplsを含めてWebサーバーがmod_plsqlを起動するように構成されていることを示し、続けてCode Wizard管理者が使用するDADの名前ordcwadminを含めます。

HTMLページが表示されると、次のCode Wizard管理者のURLに解決されます。

http://<hostname>:<port-number>/pls/ordcwadmin/ORDCWPKG.menu

ORDCWPKG.menupackage.procedure名を表します。この名前はordcwadmin DADのデフォルトのホームページとして指定されています。

起動したPL/SQL Gatewayではステートレス・モデルが使用され、複数のHTTPリクエスト間をトランザクションがまたがることはできません。このステートレス・モデルでは通常、HTTP Cookieを使用するか、HTML FormパッケージのHTML form要素としてhidden HTMLフィールドを使用するか、または問合せ用にデータベース表の重要な情報のストレージを使用することによって、アプリケーションが状態を保持するセッションを作成できます。