zoukankan      html  css  js  c++  java
  • oracle中读写blob字段的问题

     LOB類型分為BLOB和CLOB兩種:BLOB即二進制大型對像(Binary Large Object),適用於存貯非文本的字節流數據(如程序、圖像、影音等)。而CLOB,即字符型大型對像(Character Large Object),則與字符集相關,適於存貯文本型的數據(如歷史檔案、大部頭著作等)。

    下面以程序實例說明通過JDBC操縱Oracle數據庫LOB類型字段的幾種情況。

    先建立如下兩個測試用的數據庫表,Power Designer PD模型如下:

    建表SQL語句為:
    CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
    CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)

    一、 CLOB對象的存取

    1、往數據庫中插入一個新的CLOB對像

    public static void clobInsert(String infile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 插入一個空的CLOB對像 */
    stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
    /* 查詢此CLOB對象並鎖定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 取出此CLOB對像 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 向CLOB對像中寫入數據 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出錯回滾 */
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }

    2、修改CLOB對像(是在原CLOB對像基礎上進行覆蓋式的修改)

    public static void clobModify(String infile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 查詢CLOB對象並鎖定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 獲取此CLOB對像 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 進行覆蓋式修改 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出錯回滾 */
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }
    3、替換CLOB對像(將原CLOB對像清除,換成一個全新的CLOB對像)

    public static void clobReplace(String infile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 清空原CLOB對像 */
    stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
    /* 查詢CLOB對象並鎖定 */
    ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
    while (rs.next()) {
    /* 獲取此CLOB對像 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 更新數據 */
    BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
    BufferedReader in = new BufferedReader(new FileReader(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出錯回滾 */
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }

    4、CLOB對像讀取

    public static void clobRead(String outfile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 查詢CLOB對像 */
    ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
    while (rs.next()) {
    /* 獲取CLOB對像 */
    oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
    /* 以字符形式輸出 */
    BufferedReader in = new BufferedReader(clob.getCharacterStream());
    BufferedWriter out = new BufferedWriter(new FileWriter(outfile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    out.close();
    in.close();
    }
    } catch (Exception ex) {
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }
    二、 BLOB對象的存取

    1、 向數據庫中插入一個新的BLOB對像

    public static void blobInsert(String infile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 插入一個空的BLOB對像 */
    stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");
    /* 查詢此BLOB對象並鎖定 */
    ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
    while (rs.next()) {
    /* 取出此BLOB對像 */
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
    /* 向BLOB對像中寫入數據 */
    BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出錯回滾 */
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }

    2、修改BLOB對像(是在原BLOB對像基礎上進行覆蓋式的修改)

    public static void blobModify(String infile) throws Exception
    {
    /* 設定不自動提交 */
    boolean defaultCommit = conn.getAutoCommit();
    conn.setAutoCommit(false);

    try {
    /* 查詢BLOB對象並鎖定 */
    ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
    while (rs.next()) {
    /* 取出此BLOB對像 */
    oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
    /* 向BLOB對像中寫入數據 */
    BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
    int c;
    while ((c=in.read())!=-1) {
    out.write(c);
    }
    in.close();
    out.close();
    }
    /* 正式提交 */
    conn.commit();
    } catch (Exception ex) {
    /* 出錯回滾 */
    conn.rollback();
    throw ex;
    }

    /* 恢復原提交狀態 */
    conn.setAutoCommit(defaultCommit);
    }

  • 相关阅读:
    HDU 1229 还是A+B(A+B陶冶情操)
    WINDOWS API ——CREATETOOLHELP32SNAPSHOT——查找进程
    WinAPI: GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
    创建线程后马上CloseHandle(threadhandle)起什么作用
    CloseHandle(),TerminateThread(),ExitThread()的区别
    WinAPI: OpenProcess、GetExitCodeProcess、TerminateProcess (测试强制关闭 OICQ)
    GetVersion和GetVersionEx
    WinAPI: GetModuleFileName、GetModuleHandle
    C# 获取窗口句柄并且关闭应用程序
    IsWindow,findwindow
  • 原文地址:https://www.cnblogs.com/xuewater/p/2963271.html
Copyright © 2011-2022 走看看