在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

通過JDBC操縱Oracle數據庫LOB字段的區分

通過JDBC操縱Oracle數據庫LOB字段的區分

更新時間:2025-10-17 文章作者:未知 信息來源:網絡 閱讀次數:

數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應...
數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。
     在Oracle中,LOB(Large Object,大型對象)類型的字段現在用得越來越多了。因為這種類型的字段,容量大(最多能容納4GB的數據),且一個表中可以有多個這種類型的字段,很靈活,適用于數據量非常大的業務領域(如圖象、檔案等)。而LONG、LONG RAW等類型的字段,雖然存儲容量也不小(可達2GB),但由于一個表中只能有一個這樣類型的字段的限制,現在已很少使用了。 
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);

[page_break]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);
}
[page_break]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);
}
3、替換BLOB對象(將原BLOB對象清除,換成一個全新的BLOB對象)
public static void blobReplace(String infile) throws Exception
{
/* 設定不自動提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 清空原BLOB對象 */
stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID=’222’");
/* 查詢此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);
}
4、BLOB對象讀取
public static void blobRead(String outfile) throws Exception
{
/* 設定不自動提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查詢BLOB對象 */
ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID=’222’");
while (rs.next()) {
/* 取出此BLOB對象 */
oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
/* 以二進制形式輸出 */
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));
BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
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);
}

觀察上述程序對LOB類型字段的存取,我們可以看出,較之其它類型字段,有下面幾個顯著不同的特點:

一是必須取消自動提交。
存取操作開始前,必須用setAutoCommit(false)取消自動提交。其它類型字段則無此特殊要求。這是因為存取LOB類型字段時,通常要進行多次操作可以完成。不這樣的話,Oracle將拋出“讀取違反順序”的錯誤。

二是插入方式不同。
LOB數據不能象其它類型數據一樣直接插入(INSERT)。插入前必須先插入一個空的LOB對象,CLOB類型的空對象為EMPTY_CLOB(),BLOB類型的空對象為EMPTY_BLOB()。之后通過SELECT命令查詢得到先前插入的記錄并鎖定,繼而將空對象修改為所要插入的LOB對象。

三是修改方式不同。
其它類型的字段修改時,用UPDATE … SET…命令即可。而LOB類型字段,則只能用SELECT … FOR UPDATE命令將記錄查詢出來并鎖定,然后才能修改。且修改也有兩種改法:一是在原數據基礎上的修改(即覆蓋式修改),執行SELECT … FOR UPDATE后再改數據;二是替換(先將原數據清掉,再修改),先執行UPDATE命令將LOB字段之值設為空的LOB對象,然后進行第一種改法。建議使用替換的方法,以實現與其它字段UPDATE操作后一樣的效果。

四是存取時應使用由數據庫JDBC驅動程序提供的LOB操作類。
對于Oracle數據庫,應使用oracle.sql.CLOB和oracle.sql.BLOB。不使用由數據庫JDBC驅動程序提供的LOB類時,程序運行時易于出現“抽象方法調用”的錯誤,這是因為JDBC所定義的java.sql.Clob與java.sql.Blob接口,其中的一些方法并未在數據庫廠家提供的驅動程序中真正實現。

五是存取手段與文件操作相仿。
對于BLOB類型,應用InputStream/OutputStream類,此類不進行編碼轉換,逐個字節存取。oracle.sql.BLOB類相應提供了getBinaryStream()和getBinaryOutputStream()兩個方法,前一個方法用于讀取Oracle的BLOB字段,后一個方法用于將數據寫入Oracle的BLOB字段。
對于CLOB類型,應用Reader/Writer類,此類進行編碼轉換。oracle.sql.CLOB類相應提供了getCharacterStream()和getCharacterOutputStream()兩個方法,前一個方法用于讀取Oracle的CLOB字段,后一個方法用于將數據寫入Oracle的CLOB字段。
需要說明的是,為了大幅提高程序執行效率,對BLOB/CLOB字段的讀寫操作,應該使用緩沖操作類(帶Buffered前綴),即:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。例程中全部使用了緩沖操作類。

小結:通過JDBC操縱Oracle數據庫的LOB字段,不外乎插入、修改、替換、讀取四種方式,掌握起來并不難。在實際操作中要注意上面所說的幾點,結合閱讀例程源程序,用戶會很快明白LOB類型字段的使用的,也必將領悟到這種類型字段的妙處!

全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 香蕉视频xxxx| 无码人妻精品一区二区蜜桃网站| 日韩精品久久一区二区| 极品粉嫩美女露脸啪啪| 女人另类性混交zo| 免费在线观看毛片网站| 免费在线观看亚洲视频| 精品视频免费在线播放| 日韩日韩日韩日韩日韩| 性欧美大战久久久久久久| 青青草综合在线| 日韩免费在线观看av| 三级在线免费观看| 真实国产乱子伦对白视频| 欧美交换配乱吟粗大25p| 国内外成人激情免费视频| 日日噜噜夜夜狠狠久久丁香五月| 一级一片免费播放| 成人免费看片视频在线观看| www.男人天堂网| 欧美aⅴ在线观看| 亚洲色图久久久| 日韩精品在线播放视频| 日韩激情视频一区二区| 欧美日韩一道本| 久久久久免费精品| 久久精品国产99久久99久久久| 四虎4hu永久免费入口| 九一国产精品视频| 人妻丰满熟妇av无码区app| wwwwwxxxx日本| 男女爱爱视频网站| 韩国一区二区av| 香蕉视频xxx| 亚洲国产精品久久久久婷蜜芽| 超碰超碰在线观看| 中国丰满熟妇xxxx性| 在线观看亚洲色图| 精品一二三四五区| 色哟哟精品视频| 在线观看17c| 亚洲成人福利在线| 亚洲色欲久久久综合网东京热| 奇米影音第四色| 18禁网站免费无遮挡无码中文| 亚洲美女性囗交| 97国产在线播放| 国产在线拍揄自揄拍无码| 欧美视频第三页| 成人精品视频在线播放| 亚洲美女自拍偷拍| 熟妇人妻无乱码中文字幕真矢织江| 日本三级中文字幕在线观看| 五月婷婷丁香综合网| 久久国产亚洲精品无码| 青青视频免费在线| 91视频福利网| 青青草原播放器| 中文字幕成人免费视频| 妺妺窝人体色www在线观看| 欧美国产日韩激情| 精品国偷自产一区二区三区| 亚洲综合在线一区二区| 制服丝袜中文字幕第一页| 人人爽人人av| 久久婷婷国产91天堂综合精品| 国模无码视频一区二区三区| www.成年人视频| 欧美在线观看黄| 久久手机在线视频| 日韩一区二区高清视频| 久久久天堂国产精品| 四虎4hu永久免费入口| 无码人妻aⅴ一区二区三区日本| 中文字幕线观看| 亚洲高清在线不卡| 久久久国产精华液999999 | 黄色国产一级视频| 999久久欧美人妻一区二区| 超碰97免费观看| 精品一二三四五区| www..com日韩| 成人黄色一区二区| 五月天亚洲视频| 久久精品国产99久久99久久久| 妞干网这里只有精品| 天天做天天躁天天躁| 免费看又黄又无码的网站| 成人亚洲视频在线观看| 亚洲涩涩在线观看| 糖心vlog在线免费观看| av之家在线观看| 手机版av在线| 欧美高清中文字幕| 久久国产乱子伦免费精品| 欧美黄色性生活| 国产一级黄色录像片| 国产日韩一区二区在线| 天天干天天色天天干| 日本福利视频网站| 久草综合在线观看| 日本丰满大乳奶| 久久国产乱子伦免费精品| 久热在线视频观看| 亚洲 欧美 日韩 国产综合 在线| 天天天干夜夜夜操| 亚洲一区二区三区av无码| 午夜免费一区二区| av网站大全免费| 性久久久久久久久久久久久久| 少妇人妻大乳在线视频| 国产又粗又长又爽又黄的视频| 国产美女永久无遮挡| 亚洲欧美aaa| 男人天堂999| 欧美日韩不卡在线视频| 在线观看免费的av| aaa毛片在线观看| 97超碰在线人人| 精品国产三级a∨在线| 免费看污污网站| 激情婷婷综合网| 久久国产精品视频在线观看| 欧美 亚洲 视频| 欧美性视频在线播放| 五月婷婷六月合| 99视频精品免费| 欧美女人性生活视频| av免费看网址| 桥本有菜av在线| 亚欧精品在线视频| 黄大色黄女片18第一次| 中文字幕在线导航| 一本大道熟女人妻中文字幕在线 | 日本在线xxx| 日本日本19xxxⅹhd乱影响| 18禁裸男晨勃露j毛免费观看 | 国产精品久久久久7777| 国产免费内射又粗又爽密桃视频| 91香蕉视频在线观看视频| 日日干日日操日日射| 一级淫片在线观看| 日韩欧美中文在线视频| 亚洲免费一级视频| 国产一区二区在线免费播放| 日本精品久久久久中文字幕| 人妻有码中文字幕| 亚洲 中文字幕 日韩 无码| 在线视频日韩一区 | 男人日女人下面视频| 欧美视频在线观看视频| 成人免费aaa| jizz欧美激情18| 亚洲欧美日韩网站| 秋霞在线一区二区| 精品久久久久久久久久中文字幕| 国产黄色一级网站| 自拍偷拍21p| 国产在线无码精品| 国产a级一级片| 中文字幕在线视频精品| 国产精品视频二| 国产极品美女高潮无套久久久| 亚洲欧美日本一区二区三区| 永久免费看av| 北条麻妃av高潮尖叫在线观看| 亚洲免费看av| 亚洲色成人www永久在线观看| 欧美视频第三页| 天天操夜夜操很很操| 91好吊色国产欧美日韩在线| 无尽裸体动漫2d在线观看| 亚洲精品久久久久久久蜜桃臀| 日韩中文字幕二区| 国产av第一区| 日韩免费高清在线| 欧美视频在线第一页| 日日干夜夜操s8| 国产网站免费在线观看| 日本久久高清视频| 日本激情视频在线| 欧妇女乱妇女乱视频| 人人爽人人爽av| 午夜视频在线瓜伦| 欧美激情 国产精品| 最新中文字幕久久| 潘金莲激情呻吟欲求不满视频| 成人午夜精品久久久久久久蜜臀| 中文字幕剧情在线观看| 色一情一乱一伦一区二区三区日本| 六月婷婷激情综合| 日韩第一页在线观看| 污污网站免费看| 国产精品69页| 欧美日韩亚洲一| 亚洲自偷自拍熟女另类| 岛国大片在线播放| 日本成人在线不卡| 四虎免费在线观看视频| 手机在线免费毛片|