Oracle interMediaをPHPから使用できないか?

つ〜ことでGoogleって見た。
10g付属のinterMediaのservlet/jspサンプルと同じテーブル構成の物を、PHP5から実行するサンプルのようです。
EZ-Connectって書いてあるので、おそらくInstant-Client用の記述ですが、普通にOCI8のDSN書いてもコードは通りますね。
(当たり前だ)

サンプルスキーマとして、ORD_TESTを用意。テスト用なのでDBAロールを付与してしまいます。クォータも無制限。

CREATE USER ORD_TEST
IDENTIFIED BY ********
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
/
GRANT DBA TO ORD_TEST
/
GRANT UNLIMITED TABLESPACE TO ORD_TEST
/

引き続き、サンプルで使用するテーブルを作成。

CREATE TABLE photos( id          NUMBER  UNIQUE  NOT NULL, 
                     description VARCHAR2(40)    NOT NULL,
                     location    VARCHAR2(40), 
                     image       ORDSYS.ORDIMAGE,
                     thumb       ORDSYS.ORDIMAGE );

引き続き、シーケンスを作成。

CREATE SEQUENCE photos_sequence;

サンプルコードは以下のようになってるので、そのまま利用。

<?php 
 
if (!isset($_POST['description']) || !isset($_POST['location']) ||
    !isset($_FILES['photo'])) {
?>
<HTML>
  <BODY>
    <FORM name="uploadForm"
          method="post" enctype="multipart/form-data">
      <P>
        Location?    <INPUT type="text" name="location"/><BR/>
        Description? <INPUT type="text" name="description"/><BR/>
        Image File?  <INPUT type="file" name="photo"/><BR/>
        <INPUT type="submit" value="Submit" />
      </P>
    </FORM>
  </BODY>
</HTML>
<?php
   }
else{
    // Connect to the DB. Using OCI8 syntax 
    // (must have Oracle Net configured)
    $conn = oci_connect('ord_test', '********', '****');
    // Call procedure to put photo
    $r = db_put_photo($conn, $_POST['description'], 
                      $_POST['location'],
                      $_FILES['photo']['tmp_name'], 
                      $_FILES['photo']['type']);
    $here = $_SERVER['PHP_SELF']; 
    if ($r) echo "Upload Successful. <a href=\"$here\"> Again? </a>";
    else echo "Upload Failed. <a href=\"$here\"> Try Again? </a>";
   }
 
   //
   // Function to put photo into database
   //
   function db_put_photo($conn, $description, $location, 
                         $imgfile, $defaultmime)
    {
      $stmttxt = 
          "INSERT INTO photos t 
              (id, description, location, image, thumb)
              VALUES(photos_sequence.nextval,:descr,:loc, 
                     ordimage.init(), ordimage.init())
             RETURNING t.image.getcontent(), rowid into 
                     :lob, :rid";
 
      $stmt = oci_parse($conn, $stmttxt);
 
      // Fill in text filelds
      oci_bind_by_name($stmt, ':descr', $description, -1);
      oci_bind_by_name($stmt, ':loc', $location, -1);
 
      // Get lob descriptor
      $lob = oci_new_descriptor($conn, OCI_D_LOB);
      oci_bind_by_name($stmt, ':lob', $lob, -1, OCI_B_BLOB);
 
      // Get rowid
      oci_bind_by_name($stmt, ':rid', $rid, 64);
 
      // Execute the statement
      oci_execute($stmt, OCI_DEFAULT);
 
      $handle = fopen($imgfile, "r");
      while ( !feof($handle) ) $lob->write(fread($handle, 65534));
 
      // Update the photo and create a thumbnail image.
      // If we can't figure out the mimetype,
      // use the mimetype passed into the webserver.
      $stmttxt = "
	DECLARE
           img ordimage;
           th  ordimage;
         BEGIN
           select image, thumb into img, th from photos 
                     where rowid = :rid;
           begin
             img.setproperties();
             img.processcopy
                 ('fileFormat=JFIF maxScale=128 128', th);
           exception
             when others then
               img.setMimeType(:mt);
               th := null;
             end;
             update photos set image=img, thumb=th 
                    where rowid=:rid;
             commit;
         END;";
      $stmt = oci_parse($conn, $stmttxt);
 
      oci_bind_by_name($stmt, ':rid', $rid, -1);
      oci_bind_by_name($stmt, ':mt', $defaultmime, -1);
      oci_execute($stmt, OCI_DEFAULT);

      oci_commit($conn);

 
      // Free up resources
      oci_free_statement($stmt);
      $lob->free();
 
      return true;
    }
?>

このサンプルでは、LocationとDescription、画像ファイルを指定すると、対応する列にデータを格納するみたい。
…なのだが、どうにもサムネイルが上手く作成されない。
サムネイルを作るPL/SQLプロシジャが怪しいとにらんでいるけれども、とりあえずはデータ登録は可能になったようだ。
…続く?