• 締切済み

ORACLEにバイナリデータを格納するに適した項目の型は?

JAVAを使って、ORACLE8iを用いたWebを開発してます。 JAVAのByte型に格納したバイナリデータをORACLEに格納しようと思ったのですが、適した型が見つからず悩んでます。 BLOB型を検討したのですが、一定のサイズを超過するとレスポンスの問題が関係し、アクセス方法が別途必要する事がわかりました。 私的には、integer型のように扱ってデータをアクセスできたらと思います。(専用のインターフェースを使用しない) すみませんが、宜しくお願いします。

みんなの回答

  • mi-si
  • ベストアンサー率35% (200/567)
回答No.3

BLOB(Binary Large OBject)は、あくまでもオブジェクトデータ型ですので、手続きが少々煩雑になるのは仕方ないですね。 JDBC3.0の拡張であるsetBinaryStreamか、setBytes(JDK1.4以上)。かOracle JDBC Driverの拡張型であるoracle.sql.BLOB型のgetOutputBinaryStreamを使うのが常套手段でしょうか? 単にバイナリを扱うならRAW型(2000byte)、LONG RAW型(2GByte-1)がありますが、LONG RAWはテーブルに1つしか作れないなど制限ががありますし、データへのアクセスはシーケンシャルに持ってくるので必要なときだけデータにアクセスするBLOB型よりレスポンスはあんまり良くないと思います。

参考URL:
http://otn.oracle.co.jp/document/products/oracle9i/920/develop.html#java
asaichi
質問者

お礼

ありがとうございます。 integer型のような扱いをする事ができないのですね。バイナリをデータで扱うのは、結構制限があるのですね。 代用する型もあるのは、初めて知りました。でも、制約が…。 oracleだけでなく、JAVAのバージョンにもよるとなると、自分の環境を再度確認した方がよいですね。 ちなみに、J2EE1.3です。 また、参考・アドバイスがありましたら、お願いします。

回答No.2

確かにBLOBを利用するとアクセスが難しくなりますが、 バイナリデータはBLOBで格納する以外ないと思います。 共通関数的なものを自分で作成して、どのデータ型でも 同じようなアクセス方法で対応できるようにするのも ひとつの手だと思います。 また、OracleとJDBCのバージョンが共に8.1.6以上で あれば、setBinaryStream,setObject等で比較的 簡単にBLOBに書き込みできると思います。

参考URL:
http://otn.oracle.co.jp
asaichi
質問者

お礼

アドバイスありがとうございます。 やはり、アクセスは難しくなるのですね。 「共通関数…」なるほど。ネットで調べても、サンプルが少なかったので、あまり着たい出来ないのかなと思ってました。 「setBinaryStream,setObject」を中心に調査に入りたいと思います。 ありがとうございました。 又、何か気づいた点がありましたら、お願いします。

回答No.1

 バイナリデータをファイルで落とし、Oracle上ではファイル名を保持するようにした方が良いです。

asaichi
質問者

お礼

早々の回答ありがとうございます。 ファイルにして、ファイル名を管理したほうがよいですよね。 できれば、DBに実体を格納したい…というのが希望なんです。

関連するQ&A

  • バイナリデータをOracleテーブルに登録したい。

    VB6.0、Oracle9iを使用して、バイナリデータを登録・参照するプログラムを作ろうとしています。 やりたいことは以下の通りです。 1.OracleのBLOB形のフィールドにバイナリデータ(bmp,xlsなど)を登録する。 2.1で登録したバイナリデータを取得し、テンポラリフォルダに保存する。 どなたがご存知の方がいらっしゃいましたら教えて下さい。 宜しく御願いします

  • DXF形式をOracleに格納する方法が知りたいです。

    CADデータ(DXF形式)をBLOB化し、Oracle8に格納する事ができますか? またその格納方法のさわりを知りたいです。

  • XMLをバイナリに変換することが出来ますか?

    XMLで記述したファイルがあります。これを、バイナリとしてオラクル上のデータベース上のblobカラムに格納(及び格納後、SQLによる読み込み)することは出来ますか? 背景: あるソフトウェアで、XML形式のファイルをバイナリに変換してデータベース上のblobテーブルに格納しているそうです。この変換作業がこのソフトウェア会社独自のアルゴリズムによる何か特権的なものなのか、それとも何かスタンダードな変換ツールや仕様があってそれを使えばそういうことが出来るものなのかがわかりません。まずは、何もソフトウェアを買わずに単純に個人レベルでそういうことができるのか、出来るのであれば実際にやってみたくて質問致しました。この分野に素人で恐縮ですが宜しくお願いします。

  • Oracle : BLOB型フィールドへのデータ設定方法

    Oracle9iで、 あるテーブルのBLOB型フィールドへバイナリーデータを設定する方法をご教授ください。 とにかく、一回だけ、 ある1レコード(あるいは全レコード同じデータでもかまわない)の1フィールドに何かを設定できればいいので ・オペレーション(手入力)で設定 ・設定するプログラムを作る いずれでも構いません。 利用できるのは ・オブジェクトブラウザ ・Oracle9i標準のツール(sqlplus等) 作成可能なプログラム ・VC++ , VB よろしくお願いします

  • バイナリ読み込みについて

    お世話になります。バイナリファイルの読み込みについて質問させてください。 バイナリファイルはC#で出力したものでushort型(符号無し16bit)で書き込んでいます。 //C#でushort型データのバイナリ書き込み例 private static void WriteBinary(){  ushort data=5000;   BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\Binary.txt", FileMode.Create, FileAccess.Write)); bw.Write(data); bw.Close(); } これをJavaで読んで、書き込んだ値5000を取得したいのですが、 C#のushortは符号無しの2Byteなんので、Javaでそれに相当するように readUnsignedShortで読み込んだのですがうまくいきません。どなたかご教授ください。 //Javaでushort型データのバイナリ読み込み private static void ReadBinary(){  DataInputStream dis = new DataInputStream(new FileInputStream("C:\\Binary.txt"));  int data = dis.readUnsignedShort();  System.out.println(data);  } すると「34835」と表示されます。その他、readShort()→-30701 read(byte[2])として byteに格納してbyte[0]と[1]を足しても-101になり取得できませんでした。 保存されたデータは符号なしの16ビットなのでreadUnsignedShort()で取得できると 思ったのですが、何か根本的に考え方が違うのでしょうか?? ※もちろんC#でReadInt16で読み取ると正常に5000を取得できした。

    • ベストアンサー
    • Java
  • Oracle BLOB→Byte→.tif の変換

    こんばんわ。 タイトル通り、OracleのBLOB型の画像データをjavaのByte型に変換し、それをtiffファイルに変換したいのですが、Javaを始めたばかりで調べてもわかりませんでした。みなさんのお力をお借りしたいのですが・・・。 とりあえず、以下のソースでBLOB型のデータを取得し、byte型に変換まではできたのですが、これからこのバイトデータを.tifファイルへと変換するのがどうしてもわかりません。 ご回答お願いいたします。 ---------------------------------------------------------------- public class Image{ private byte[] imgData; public Blobconvert() { } public Blobconvert(byte[] image) { this.imgData = imgData; } public Blobconvert(InputStream imgData) throws IOException { byte[] buf = new byte[4096]; ByteArrayOutputStream bos = new ByteArrayOutputStream); while (true) {    int len = imgData.read(buf); if (len == -1) break; bos.write(buf, 0, len); } this.imgData = bos.toByteArray(); bos.close(); } public Blobconvert(Blob imgData) throws SQLException, IOException { this(imgData.getBinaryStream()); } } ---------------------------------------------------------------- Blob blbImage = rs.getBlob("SendFile");//SQL文の結果 Blobconvert listModel = null;          if (blbImage != null) listModel = new Blobconvert(blbImage); else listModel = new Blobconvert(); ----------------------------------------------------------------

  • AccessからOracleへのリンクテーブル時の型情報?

    Access始めたばかりの初心者です。 現在Oracle10gのデータベースのとあるテーブルを をAccess2000でリンクし、クエリで抽出したものをレポートに表示 しようとしています。 そのテーブル上に、 Oracle上ではVARCHAR2(6バイト)の日付データがあります。 例) 200806 これをAccessのクエリ上で変換し、 "6月" と表示させたいのですが、 なぜかうまくいきません。 Oracle上の項目名が YM だとすると、 Replace(Right([YM], 2), "0", "") & "月" こういった関数でうまくいきそうなものですが・・ もしかしてOracleのVARCHAR2はリンクすると文字列型以外の型として 扱われるのでしょうか・・ どなたかご存じの方、ご教授くださいませ。

  • MYSQLで、ファイルを格納する方法を教えてください。

    動画ファイルの中身のバイナリデータをまるごとMYSQLのフィールドに格納したいのですが、方法が分かりません。 現在分かっていることは、データ形式をBLOB型として格納することくらいです。 SQL文から、またはC APIを使って実現する方法を教えてください。よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • C#で、ファイルのデータを取得し、配列に格納

    C#を始めたばかりで分からないことも多いため、質問させていただきます。 C#で、テキストファイルにある2進数の数値 例: 00111100 11111100 00010100 のような8桁のデータをC#でテキストファイルから2進数のまま読み取り、 配列に格納したいです。 上の例で考えると、 byte[0]に 00111100 byte[1]に 11111100 byte[2]に 00010100  のデータが入力されているような感じです。 ArrayListを使用する方法や、 バイナリファイルで読み込む方法などもあると思うのですが、 データを1行ごとに配列に入力し、 それを見た目どおり2進数として格納する方法が分かりません。 やはり、文字コードなどを参考に、 1文字ずつ格納し、引き算していくしか方法はないのでしょうか? 文章が分かりにくくて申し訳ないのですが、回答いただけるとありがたいです! よろしくお願いいたします。

  • javaバイナリ変換したデータのファイル出力

    現在、 String test_st = "0123456789abcdef"; というデータを byte[] bytes = test_st.getBytes("UTF-8"); このコードでバイナリ変換したのですが、このbytesに格納したバイナリデータたバイナリファイルとして出力したいのですが、どのようにしたらよいかご教授よろしくお願い致します。 BinaryFileWriter writer = new BinaryFileWriter(); このようなコードで出力できるとのサンプルもあったのですが、うまくいきません。 どうぞ、よろしくお願い致します。

    • ベストアンサー
    • Java