5.4 様々なプログラム・インタフェースでのBFILE API

この項では、Oracle Databaseでサポートされている様々なプログラム・インタフェースのすべてのAPIを示します。

ノート:

PL/SQLのDBMS_LOBパッケージは、BFILEに対する豊富な操作セットを提供します。これらの操作の一部が提供されていない別のプログラム・インタフェースを使用している場合は、対応するPL/SQLのDBMS_LOBプロシージャまたは関数を呼び出します。

5.4.1 BFILE用のPL/SQL API

この項では、BFILEで使用できるPL/SQL APIについて説明します。

関連項目:

DBMS_LOB

表5-3 BFILE用のDBMS_LOB関数およびプロシージャ

分類 関数およびプロシージャ 説明
健全性チェック FILEEXISTS サーバーにBFILEが存在するかどうかをチェック
FILEGETNAME DIRECTORYオブジェクト名とファイル名の取得
BFILENAME ディレクトリまたはファイルが存在するかどうかをチェックせずに、ロケータにBFILEの名前を設定
オープンとクローズ OPEN、FILEOPEN ファイルをオープンします。FILEOPENのかわりにOPENを使用します。
ISOPEN、FILEISOPEN 入力BFILEロケータを使用してファイルがオープンされたかどうかをチェックします。FILEISOPENのかわりにISOPENを使用します。
CLOSE、FILECLOSE ファイルをクローズします。FILECLOSEのかわりにCLOSEを使用します。
FILECLOSEALL 前にオープンされたファイルをすべてクローズします。
読取り操作 GETLENGTH BFILEの長さの取得
READ 指定されたオフセットからBFILEのデータを読み取ります。
SUBSTR 指定されたオフセットからBFILE値の一部を返します。
INSTR BFILEにあるパターンのn番目に出現した一致位置を返します。
複数のロケータを含む操作 := (演算子) BFILEロケータの別のロケータへの割当て
LOADCLOBFROMFILE 文字データのファイルからLOBへのロード
LOADBLOBFROMFILE バイナリ・データのファイルからLOBへのロード
LOADFROMFILE BFILEデータをLOBにロード(非推奨)
COMPARE 2つのBFILEの値を比較します。

例5-3 BFILE用のPL/SQL API

declare
  f           BFILE;
  f2          BFILE;
  b           BLOB;
  c           CLOB;
  dest_offset NUMBER;
  src_offset  NUMBER;
  lang        NUMBER;
  warn        NUMBER;
  buffer      RAW(128);
  amt         NUMBER;
  len         NUMBER;
  pos         NUMBER;
  filename    VARCHAR2(128);
  dirname     VARCHAR2(128);
BEGIN

   /* Select out a BFILE locator */
  SELECT ad_graphic INTO f FROM print_media WHERE product_id = 1 AND ad_id = 1;
 
  /*------------------------------------------------------------------*/
  /*---------------------- Sanity Checking ---------------------------*/
  /*------------------------------------------------------------------*/
 
  /*-------------- Determining Whether a BFILE Exists ----------------*/
  if DBMS_LOB.FILEEXISTS(f) = 1 then
    DBMS_OUTPUT.PUT_LINE('F exists!');
  else
    DBMS_OUTPUT.PUT_LINE('F does not exist :(');
    return;
  end if;
 
  /*------ Getting Directory Object Name and File Name of a BFILE ----*/
  DBMS_LOB.FILEGETNAME(f, dirname, filename);
  DBMS_OUTPUT.PUT_LINE('F: directory: '|| dirname ||' filename: '|| filename);
 
  /*------------------------------------------------------------------*/
  /*----------------------- Open/Close -------------------------------*/
  /*------------------------------------------------------------------*/
 
  /*----------------------- Opening a BFILE --------------------------*/
  DBMS_LOB.OPEN(f, DBMS_LOB.LOB_READONLY);
 
  /*-------------- Determining Whether a BFILE Is Open ---------------*/
  if DBMS_LOB.ISOPEN(f) = 1 then
    DBMS_OUTPUT.PUT_LINE('F is open!');
  else
    DBMS_OUTPUT.PUT_LINE('F is not open :(');
  end if;
 
  /*----------------------- Closing a BFILE --------------------------*/
  DBMS_LOB.CLOSE(f);
 
  /*------------ Closing All Open BFILEs with FILECLOSEALL -----------*/
  DBMS_LOB.FILECLOSEALL;
 
  /*------------------------------------------------------------------*/
  /*-------------------- BFILE operations ----------------------------*/
  /*------------------------------------------------------------------*/
 
  DBMS_LOB.OPEN(f, dbms_lob.lob_readonly);
 
  /*----------------- Getting the Length of a BFILE ------------------*/
  len := DBMS_LOB.GETLENGTH(f);
  DBMS_OUTPUT.PUT_LINE('dbms_lob.getlength: '||len);
 
  /*------------------------ Reading BFILE Data ----------------------*/
  amt := 15;
  DBMS_LOB.READ(f, amt, 1, buffer);
  DBMS_OUTPUT.PUT_LINE('dbms_lob.read: '||UTL_RAW.CAST_TO_VARCHAR2(buffer));
 
  /*--------- Reading a Portion of BFILE Data Using SUBSTR -----------*/
  buffer := DBMS_LOB.SUBSTR(f, 15, 3);
  DBMS_OUTPUT.PUT_LINE('dbms_lob.substr: '||UTL_RAW.CAST_TO_VARCHAR2(buffer));
 
  /*------ Checking If a Pattern Exists in a BFILE Using INSTR -------*/
  pos :=  DBMS_LOB.INSTR(f, utl_raw.cast_to_raw('BFILE'), 1, 1);
  if pos != 0 then
    DBMS_OUTPUT.PUT_LINE('dbms_lob.instr: "BFILE" word exists in position ' || pos);
  else
    DBMS_OUTPUT.PUT_LINE('dbms_lob.instr: "BFILE" word does not exist in file');
  end if;
 
  /*------------------------------------------------------------------*/
  /*------------- Operations involving 2 locators ---------------------*/
  /*------------------------------------------------------------------*/
 
  /*----------------- Assigning a BFILE Locator ----------------------*/
  f2 := f; -- where f2 is also a bfile variable
 
  amt := 15;
  DBMS_LOB.READ(f2, amt, 1, buffer);
  DBMS_OUTPUT.PUT_LINE('assign: dbms_lob.read: '||UTL_RAW.CAST_TO_VARCHAR2(buffer));
 
  /*--------------- Loading a LOB with BFILE Data --------------------*/
  /* Select out BLOB and CLOB for update so we can write to them */
  select ad_composite, ad_sourcetext into b, c
  from print_media where product_id = 1 and ad_id = 1 for update;
 
  /* Load BLOB from BFILE */
  dest_offset := 1;
  src_offset  := 1;
 
  DBMS_LOB.LOADBLOBFROMFILE(b, f, dbms_lob.lobmaxsize, dest_offset, src_offset);
 
  /* Load CLOB from BFILE, for this operation is necessary to know the charset
   * id of BFILE to read it correctly */
  dest_offset := 1;
  src_offset  := 1;
  lang        := 0;
  /* Specifying the amount as DBMS_LOB.LOBMAXSIZE to copy till end of file */
  DBMS_LOB.LOADCLOBFROMFILE(c, f, DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset,
                            NLS_CHARSET_ID('utf8'), lang, warn);
 
  /*-------------- Comparing All or Parts of Two BFILES -------------*/
  SELECT ad_graphic INTO f2 FROM print_media WHERE product_id = 2 AND ad_id = 1;
  DBMS_LOB.OPEN(f2, dbms_lob.lob_readonly);
  if DBMS_LOB.COMPARE(f, f2, 10, 1, 1) = 0 then
    DBMS_OUTPUT.PUT_LINE('dbms_lob.compare: They are equals!!');
  else
    DBMS_OUTPUT.PUT_LINE('dbms_lob.compare: They are not equals :(');
  end if;
 
  -- Close just f
  DBMS_LOB.CLOSE(f);
 
  -- Close the rest of bfiles opended
  DBMS_LOB.FILECLOSEALL;
 
END;
/

5.4.2 BFILE用のJDBC API

この項では、BFILEの操作に使用できるJDBC APIについて説明します。

JDBCでは、oracle.jdbc.OracleBfileインタフェースは、データベース内のBFILEデータに対して操作を実行するためのメソッドを提供します。これはBFILEロケータをカプセル化するため、ロケータは処理せず、かわりに操作を実行して状態情報を取得するために提供されるメソッドおよびプロパティを使用します。

最新の行のロケータを取り出すには、移動操作が行われるたびに、インスタンスがBFILEかどうかに応じて、OracleResultSetgetBFILE()メソッドをコールする必要があります。

関連項目:

LOBとBFILEの操作

表5-4 BFILE用のJDBC API

分類 関数およびプロシージャ 説明
健全性チェック boolean fileExists() サーバーにBFILEが存在するかどうかをチェック
public java.lang.String getName() ファイル名の取得
public java.lang.String getDirAlias() DIRECTORYオブジェクト名の取得
オープンとクローズ public void openFile() ファイルをオープンします。
public boolean isFileOpen() 入力BFILEロケータを使用してファイルがオープンされたかどうかをチェックします。
public void closeFile() ファイルをクローズします。FILECLOSEのかわりにCLOSEを使用します。
読取り操作 long length() BFILEの長さの取得
public java.io.InputStream getBinaryStream() BFILEをバイナリ・ストリームとして読み取ります。
byte[] getBytes(long, int) オフセットを指定して、バイトの配列としてBFILEの内容を取得
int getBytes(long, int, byte[]) BFILEのサブセットをバイト配列に読み取ります。
long position(oracle.jdbc.OracleBfile, long) 指定されたオフセットから、LOB内の指定されたBFILEの内容の1番目のものを検索します。
long position(byte[],long) 指定されたオフセットから、BFILE内の指定されたバイト配列の1番目のものを検索します。
複数のロケータを含む操作 [等号を使用] BFILEロケータの別のロケータへの割当て

例5-4 BFILE用のJDBC API

static void run_query() throws Exception {
 
  try(
      OracleConnection con = getConnection();
      Statement       stmt = con.createStatement();
      ){
 
    ResultSet   rs       = null;
 
    OracleBfile f        = null;
    OracleBfile f2       = null;
    OracleBfile f3       = null;
 
    InputStream in       = null;
    String      output   = null;
    byte        buffer[] = new byte[15];
    long        pos;
 
    String      filename = null;
    String      dirname  = null;
    long        len      = 0;
 
    rs = stmt.executeQuery("select ad_graphic from print_media where product_id = 1");
    rs.next();
    f = (OracleBfile)((OracleResultSet)rs).getBfile(1);
    rs.close();
 
    rs = stmt.executeQuery("select ad_graphic from print_media where product_id = 2");
    rs.next();
    f2 = (OracleBfile)((OracleResultSet)rs).getBfile(1);
    rs.close();
 
    stmt.close();
 
    /*------------------------------------------------------------------*/
    /*---------------------- Sanity Checking ---------------------------*/
    /*------------------------------------------------------------------*/
 
    /*-------------- Determining Whether a BFILE Exists ----------------*/
    if (f.fileExists())
      System.out.println("F exists!");
    else
      System.out.println("F does not exist :(");
 
    /*------ Getting Directory Object Name and File Name of a BFILE ----*/
    dirname  = f.getDirAlias();
    filename = f.getName();
 
    System.out.println("Directory: " + dirname + " Filename: " + filename);
 
    /*------------------------------------------------------------------*/
    /*----------------------- Open/Close -------------------------------*/
    /*------------------------------------------------------------------*/
 
    /*----------------------- Opening a BFILE --------------------------*/
    f.open(LargeObjectAccessMode.MODE_READONLY);
 
    /*-------------- Determining Whether a BFILE Is Open ---------------*/
    if (f.isOpen())
      System.out.println("F is open!");
    else
      System.out.println("F is not open :(");
 
    /*----------------------- Closing a BFILE --------------------------*/
    f.close();
 
    /*------------------------------------------------------------------*/
    /*-------------------- BFILE operations ----------------------------*/
    /*------------------------------------------------------------------*/
 
    f.open(LargeObjectAccessMode.MODE_READONLY);
 
    /*----------------- Getting the Length of a BFILE ------------------*/
    len = f.length();
    System.out.println("F Length: "+len);
 
    /*------------------------ Reading BFILE Data ----------------------*/
    in = f.getBinaryStream();
    in.read(buffer);
    in.close();
 
    output = new String(buffer);
    System.out.println("Buffer: " + output);
 
    /*---- Checking If a Pattern Exists in a BFILE Using POSITION ------*/
    pos = f.position("BFILE".getBytes(), 1);
 
    if (pos != -1)
      System.out.println("\"BFILE\" word exists in position: " + pos);
    else
      System.out.println("\"BFILE\" word doesn't exist :( " );
 
    /*------------------------------------------------------------------*/
    /*------------- Operations involing 2 locators ---------------------*/
    /*------------------------------------------------------------------*/
 
    /*----------------- Assigning a BFILE Locator ----------------------*/
    f3 = f;
 
    in = f3.getBinaryStream();
    in.read(buffer);
    in.close();
 
    output = new String(buffer);
    System.out.println("assign: Buffer: " + output);
 
    /*-------------- Comparing All or Parts of Two BFILES -------------*/
    f2.open(LargeObjectAccessMode.MODE_READONLY);
    pos = f.position(f2, 1);
 
    if (pos != -1)
      System.out.println("f2 exists in position " + pos);
    else
      System.out.println("f2 doesn't exist in position");
 
    f.close();
    f2.close();
    f3.close();
  }
}

5.4.3 BFILE用のOCI API

この項では、BFILEで使用できるOCI APIについて説明します。

表5-5 BFILE用のOCI API

分類 関数およびプロシージャ 説明
健全性チェック OCILobFileExists() サーバーにBFILEが存在するかどうかをチェック
OCILobFileGetName() DIRECTORYオブジェクト名とファイル名の取得
OCILobFileSetName() ディレクトリまたはファイルが存在するかどうかをチェックせずに、ロケータにBFILEの名前を設定
OCILobLocatorIsInit() LOBロケータが初期化されているかどうかのチェック
オープンとクローズ OCILobOpen()およびOCILobFileOpen() ファイルをオープンします。OCILobFileOpen()のかわりにOciLobOpen()を使用します。
OCILobIsOpen()およびOCILobFileIsOpen() 入力BFILEロケータを使用してファイルがオープンされたかどうかをチェックします。OciLobFileIsOpen()のかわりにOCILobIsOpen()を使用します。
OCILobClose()およびOCILobFileClose() ファイルをクローズします。OciLobFileClose()のかわりにOciLobClose()を使用します。
OCILobFileCloseAll() 前にオープンされたファイルをすべてクローズします。
読取り操作 OCILobGetLength2() BFILEの長さの取得
OCILobRead2() 指定されたオフセットからBFILEのデータを読み取ります。
OCILobArrayRead() 1回のラウンドトリップで複数のロケータを使用してデータを読み取ります。
複数のロケータを含む操作 OCILobLocatorAssign() BFILEロケータの別のロケータへの割当て
OCILobLoadFromFile2() BFILEデータのファイルからLOBへのロード

例5-5 BFILE用のOCI API

static text *selstmt = (text *) "select ad_graphic, ad_composite, ad_sourcetext from print_media where product_id = 1 and ad_id = 1 for update"
sword run_query()
{
  OCILobLocator *f = (OCILobLocator *)0;
  OCILobLocator *f2 = (OCILobLocator *)0;
 
  OCILobLocator *b = (OCILobLocator *)0;
  OCILobLocator *c = (OCILobLocator *)0;
 
  OCIStmt       *stmthp;
  OCIDefine     *defn1p = (OCIDefine *) 0;
  OCIDefine     *defn2p = (OCIDefine *) 0;
  OCIDefine     *defn3p = (OCIDefine *) 0;
 
  ub4            bfilelen;
  ub1            lbuf[128];
  ub8            amt = 15;
  boolean        flag = FALSE;
  ub4            id = 10;
 
  text           filename[128];
  ub2            filename_len;
  text           dirname[128];
  ub2            dirname_len;
 
  CHECK_ERROR (OCIHandleAlloc( (dvoid *) envhp, (dvoid **) &stmthp,
                              OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0));
 
  /************** Allocate descriptors ***********************/
  CHECK_ERROR (OCIDescriptorAlloc((dvoid *) envhp, (dvoid **) &f,
                                  (ub4)OCI_DTYPE_FILE, (size_t) 0,
                                  (dvoid **) 0));
 
  CHECK_ERROR (OCIDescriptorAlloc((dvoid *) envhp, (dvoid **) &f2,
                                 (ub4)OCI_DTYPE_FILE, (size_t) 0,
                                 (dvoid **) 0));
 
  CHECK_ERROR (OCIDescriptorAlloc((dvoid *) envhp, (dvoid **) &b,
                                  (ub4)OCI_DTYPE_LOB, (size_t) 0,
                                  (dvoid **) 0));
 
  CHECK_ERROR (OCIDescriptorAlloc((dvoid *) envhp, (dvoid **) &c,
                                  (ub4)OCI_DTYPE_LOB, (size_t) 0,
                                  (dvoid **) 0));
 
  /********** Execute selstmt to get f, b, c ***********************/
  CHECK_ERROR (OCIStmtPrepare(stmthp, errhp, selstmt,
                              (ub4) strlen((char *) selstmt),
                              (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT));
 
  CHECK_ERROR (OCIDefineByPos(stmthp, &defn1p, errhp, (ub4) 1, (dvoid *) &f,
                              (sb4) -1, SQLT_BFILE, (dvoid *) 0, (ub2 *) 0,
                              (ub2 *)0, (ub4) OCI_DEFAULT));
  CHECK_ERROR (OCIDefineByPos(stmthp, &defn2p, errhp, (ub4) 2, (dvoid *) &b,
                              (sb4) -1, SQLT_BLOB, (dvoid *) 0, (ub2 *) 0,
                              (ub2 *)0, (ub4) OCI_DEFAULT));
  CHECK_ERROR (OCIDefineByPos(stmthp, &defn3p, errhp, (ub4) 3, (dvoid *) &c,
                              (sb4) -1, SQLT_CLOB, (dvoid *) 0, (ub2 *) 0,
                              (ub2 *)0, (ub4) OCI_DEFAULT));
 
  CHECK_ERROR (OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0,
                              (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,
                              OCI_DEFAULT));
 
  /*------------------------------------------------------------------*/
  /*---------------------- Sanity Checking ---------------------------*/
  /*------------------------------------------------------------------*/
 
  /*-------------- Determining Whether a BFILE Exists ----------------*/
  CHECK_ERROR (OCILobFileExists(svchp, errhp, f, &flag));
  printf("OCILobFileExists: %s\n", (flag)?"TRUE":"FALSE");
 
  /*------ Getting Directory Object Name and File Name of a BFILE ----*/
  CHECK_ERROR (OCILobFileGetName(envhp, errhp, f, (text*)dirname, &dirname_len,
                                 (text*)filename, &filename_len));
  printf("OCILobFileGetName: Directory: %.*s Filaname: %.*s \n",
         dirname_len, dirname, filename_len, filename);
 
  /*------------------------------------------------------------------*/
  /*----------------------- Open/Close -------------------------------*/
  /*------------------------------------------------------------------*/
 
  /*----------------------- Opening a BFILE --------------------------*/
  CHECK_ERROR (OCILobFileOpen(svchp, errhp, f, OCI_FILE_READONLY));
  printf("OCILobFileOpen: Works\n");
 
  /*-------------- Determining Whether a BFILE Is Open ---------------*/
  CHECK_ERROR (OCILobFileIsOpen(svchp, errhp, f, &flag));
  printf("OCILobFileIsOpen: %s\n", (flag)?"TRUE":"FALSE");
 
  /*----------------------- Closing a BFILE --------------------------*/
  CHECK_ERROR (OCILobFileClose (svchp, errhp, f));
 
  /*------------ Closing All Open BFILEs with FILECLOSEALL -----------*/
  CHECK_ERROR (OCILobFileCloseAll(svchp, errhp));
 
  /*------------------------------------------------------------------*/
  /*-------------------- BFILE operations ----------------------------*/
  /*------------------------------------------------------------------*/
 
  CHECK_ERROR (OCILobFileOpen(svchp, errhp, f, OCI_FILE_READONLY));
  printf("OCILobFileOpen: Works\n");
 
  /*----------------- Getting the Length of a BFILE ------------------*/
  CHECK_ERROR (OCILobGetLength(svchp, errhp, b, &bfilelen));
  printf("OCILobGetLength: loblen: %d \n", bfilelen);
 
  /*------------------------ Reading BFILE Data ----------------------*/
  CHECK_ERROR (OCILobRead2(svchp, errhp, f, &amt,
                           NULL, (oraub8)1, lbuf,
                           (oraub8)sizeof(lbuf), OCI_ONE_PIECE ,(dvoid*)0,
                           NULL, (ub2)0, (ub1)SQLCS_IMPLICIT));
  printf("OCILobRead2: buf: %.*s amt: %lu\n", amt, lbuf, amt);
 
  /*------------------------------------------------------------------*/
  /*------------- Operations involing 2 locators ---------------------*/
  /*------------------------------------------------------------------*/
 
  /*----------------- Assigning a BFILE Locator ----------------------*/
  CHECK_ERROR (OCILobLocatorAssign(svchp, errhp, f, &f2));
  printf("OCILobLocatorAssign: Works! \n");
 
  amt = 15;
  CHECK_ERROR (OCILobRead2(svchp, errhp, f2, &amt,
                          NULL, (oraub8)1, lbuf,
                          (oraub8)sizeof(lbuf), OCI_ONE_PIECE ,(dvoid*)0,
                          NULL, (ub2)0, (ub1)SQLCS_IMPLICIT));
  printf("OCILobLocatorAssign: OCILobRead2: buf: %.*s amt: %lu\n", amt, lbuf, amt);
 
  /*--------------- Loading a LOB with BFILE Data --------------------*/
  /* Load BLOB from BFILE. Specify amount = UB8MAXVAL to copy till end of bfile */
  CHECK_ERROR (OCILobLoadFromFile2(svchp, errhp, b, f, UB8MAXVAL, 1,1));
  printf("OCILobLoadFromFile2: BLOB case Works\n");
 
  /* Load CLOB from BFILE. Specify amount = UB8MAXVAL to copy till end of bfile.
   * Note that there is no character set conversion here. */
  CHECK_ERROR (OCILobLoadFromFile2(svchp, errhp, c, f, UB8MAXVAL, 1,1));
  printf("OCILobLoadFromFile2: CLOB case Works\n");
 
  /*  Close just f */
  CHECK_ERROR (OCILobFileClose (svchp, errhp, f));
 
  /* Close the rest of bfiles opened */
  CHECK_ERROR (OCILobFileCloseAll(svchp, errhp));
 
  OCIDescriptorFree((dvoid *) b, (ub4) SQLT_BLOB);
  OCIDescriptorFree((dvoid *) c, (ub4) SQLT_CLOB);
  OCIDescriptorFree((dvoid *) f, (ub4) SQLT_BFILE);
  OCIDescriptorFree((dvoid *) f2, (ub4) SQLT_BFILE);
 
  CHECK_ERROR (OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT));
}

5.4.4 BFILE用ODP.NET API

この項では、BFILEで使用できるODP.NET APIについて説明します。

関連項目:

OracleBFileクラス

表5-6 OracleBfileClassのODP.NETメソッド

分類 関数と説明 説明
健全性チェック FileExists サーバーにBFILEが存在するかどうかをチェック
FileName ファイル名を設定または取得
DirectoryName DIRECTORYオブジェクト名を設定または取得
オープンとクローズ OpenFile ファイルをオープンします。FILEOPENのかわりにOPENを使用します。
IsOpen 入力BFILEロケータを使用して、ファイルがオープンされたかどうかを確認します。FILEISOPENのかわりにISOPENを使用します。
CloseFile ファイルをクローズします。
読取り操作 Length BFILEの長さの取得
Value LOBデータ全体をCLOBの文字列およびBLOBのバイト配列として返す
Read 指定されたオフセットからBFILEのデータを読み取ります。
Search BFILEにあるパターンのn番目に出現した一致位置を返します。
複数のロケータを含む操作 Compare 2つのBFILEの値の比較
IsEqual 2つのLOBが同じLOBデータを指しているかどうかをチェック

5.4.5 BFILE用のOCCI API

この項では、BFILEで使用できるOCCI APIについて説明します。

OCCIでは、Bfileクラスを使用して、C++アプリケーションでBfileオブジェクトをインスタンス化できます。この場合、Bfileクラスのメソッド( setName()メソッドなど)を使用して、データベースのBFILE列内のBFILE型のオブジェクトにオブジェクト・プロパティを関連付けるBfileオブジェクトを初期化する必要があります。

関連項目:

Bfileクラス

OCCI LOB copy()メソッドの量パラメータ

ClobおよびBlobcopy()メソッドを使用すると、BFILEからデータをロードできます。このメソッドの量パラメータには、次のいずれかの値を渡すことができます。

  • データの一部をロードする場合は、BFILEのサイズよりも小さい量。

  • データ全体をロードする場合は、BFILEのサイズと等しい量。

  • BFILEデータをすべてロードする場合は、UB8MAXVAL定数。

BFILEのサイズより大きいサイズは指定できません。

OCCI read()操作の量パラメータ

ClobBlobまたはBfileオブジェクトに対するread()メソッドは、BFILEからデータを読み取ります。量パラメータの次のいずれかの値を渡して、読み取るデータ量を指定できます。

  • データの一部をロードする場合は、BFILEのサイズよりも小さい量。

  • データ全体をロードする場合は、BFILEのサイズと等しい量。

  • ゼロ(0)からBFILEの終わりまでストリーム・モードで読み取るのと等しい量

BFILEのサイズより大きいサイズは指定できません。

表5-7 BFILE用のOCCIメソッド

分類 関数およびプロシージャ 説明
健全性チェック fileExists() サーバーにBFILEが存在するかどうかをチェック
getFileName() ファイル名の取得
getDirAlias() DIRECTORYオブジェクト名の取得
setName() ディレクトリまたはファイルが存在するかどうかをチェックせずに、ロケータにBFILEの名前を設定します。
isInitialized() BFILEが初期化されるかどうかを確認します。
オープンとクローズ open() ファイルをオープンします。
isOpen() 入力BFILEロケータを使用して、ファイルがオープンされたかどうかを確認します。
close() ファイルをクローズします。
読取り操作 length() BFILEの長さの取得
read() 指定されたオフセットからBFILEのデータを読み取ります。
複数のロケータを含む操作 (演算子) = BFILEロケータを別のロケータに割り当てます。代入演算子(=)またはコピー・コンストラクタを使用します。
Blob.copy()またはClob.copy() BFILEデータのLOBへのロード

5.4.6 BFILE用のPro*C/C++およびPro*COBOL API

この項では、BFILE用に使用できるPro*C/C++およびPro*COBOL APIについて説明します。

表5-8 BFILE用のPro*C/C++およびPro*COBOL API

分類 関数およびプロシージャ 説明
健全性チェック DESCRIBE[FILEEXISTS] サーバーにBFILEが存在するかどうかをチェック
DESCRIBE[DIRECTORY,FILENAME] ディレクトリ・オブジェクト名とファイル名を取得します。
FILE SET ディレクトリまたはファイルが存在するかどうかをチェックせずに、ロケータにBFILEの名前を設定
オープンとクローズ OPEN ファイルをオープンします。
DESCRIBE[ISOPEN] 入力BFILEロケータを使用してファイルがオープンされたかどうかをチェックします。
CLOSE ファイルをクローズします。
FILE CLOSE ALL 前にオープンされたファイルをすべてクローズします。
読取り操作 DESCRIBE[LENGTH] BFILEの長さの取得
READ 指定されたオフセットからBFILEのデータを読み取ります。
複数のロケータを含む操作 ASSIGN BFILEロケータの別のロケータへの割当て
LOAD FROM FILE BFILEデータをLOBにロードします。