在线看毛片视频-国产免费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>
  • 久草视频这里只有精品| 日韩久久久久久久久久久久| 日本男人操女人| 免费不卡av网站| 热久久最新网址| 日本欧美视频在线观看| 男人靠女人免费视频网站| 女人天堂av手机在线| www.成年人视频| 亚洲国产精品女人| 亚洲免费在线播放视频| 成人在线观看a| 国产九九在线视频| 香港日本韩国三级网站| 亚洲最大综合网| 超碰超碰在线观看| 亚洲不卡视频在线| 五月天综合婷婷| 国产人妻互换一区二区| 日日摸日日碰夜夜爽无码| 国产av不卡一区二区| 国产成人永久免费视频| 亚洲免费av网| 最近中文字幕免费mv| 午夜在线观看av| 狠狠热免费视频| 一本二本三本亚洲码| 久久av高潮av| 92看片淫黄大片一级| 欧美韩国日本在线| 日本a级片在线播放| 日韩伦理在线免费观看| 欧美 国产 日本| 青青草综合视频| 国产福利视频在线播放| 福利视频一区二区三区四区| 可以免费看的黄色网址| 日韩中文字幕在线免费| 第九区2中文字幕| 日韩手机在线观看视频| 亚洲五月激情网| 久久国产精品视频在线观看| 天天综合网久久| 黄色一级片免费的| av一区二区三区免费观看| 网站在线你懂的| 五月天综合婷婷| www.国产亚洲| 久色视频在线播放| 日本中文字幕二区| 国语对白做受xxxxx在线中国| 天天干天天爽天天射| 日本久久精品一区二区| 久草青青在线观看| 午夜精品久久久久久久99热影院| 狠狠干狠狠操视频| 国产女主播自拍| 国产高清av在线播放| 色综合久久久久无码专区| 99国产精品白浆在线观看免费| 岳毛多又紧做起爽| 国产91在线亚洲| 波多结衣在线观看| 天天影视色综合| 久久婷婷国产91天堂综合精品| 亚洲网中文字幕| 美女一区二区三区视频| 99热在线这里只有精品| 99精品一级欧美片免费播放| 成人在线激情网| 国产性生交xxxxx免费| 先锋影音男人资源| 在线免费黄色网| 午夜激情av在线| 亚洲欧美自拍另类日韩| 女同性恋一区二区| 爱情岛论坛亚洲首页入口章节| 黑人巨大国产9丨视频| 精品亚洲视频在线| 欧美日韩视频免费| 五月花丁香婷婷| xxxx在线免费观看| 国产片侵犯亲女视频播放| 不卡av免费在线| 成人性生活视频免费看| 视色,视色影院,视色影库,视色网| 天天碰免费视频| 久久久久免费看黄a片app| 蜜臀精品一区二区| 国产又黄又猛的视频| 精品视频在线观看一区| 2021国产视频| 国产免费人做人爱午夜视频| 99re8这里只有精品| 中文国产在线观看| 久久久久久久9| 人妻少妇精品无码专区二区| 欧美 国产 日本| 日韩a级黄色片| 亚洲污视频在线观看| 中文字幕一区二区三区四区五区人 | 欧美 日韩 亚洲 一区| 亚洲男人天堂2021| 久久久久久综合网| www国产黄色| 99九九精品视频| 老汉色影院首页| 成年人免费观看的视频| 国产免费黄色一级片| 香蕉视频xxxx| 懂色av粉嫩av蜜臀av| 丰满女人性猛交| 国产视频一视频二| 国产免费黄色小视频| www.日本一区| 91看片就是不一样| 天天做天天爱天天高潮| 妞干网在线观看视频| 在线观看av免费观看| 91精品999| 欧美日韩一道本| 国产精品区在线| 尤物av无码色av无码| 只有这里有精品| www污在线观看| 亚洲高清在线免费观看| 亚洲av毛片在线观看| 欧美精品久久96人妻无码| 热久久最新地址| 日韩精品一区二区三区久久| 男人揉女人奶房视频60分| 超碰免费在线公开| 99精品视频国产| 中文av字幕在线观看| 日韩一区二区高清视频| 密臀av一区二区三区| 91成人在线观看喷潮教学| 亚欧精品在线视频| 蜜臀久久99精品久久久酒店新书| 亚洲午夜精品一区| 六月丁香激情网| 九九精品久久久| 成人在线观看你懂的| 免费网站在线观看黄| 在线观看高清免费视频| 天天干天天曰天天操| 91香蕉视频导航| 日韩国产一级片| www婷婷av久久久影片| 日韩 欧美 自拍| 色婷婷.com| 日韩av综合在线观看| www.亚洲成人网| 黄色片免费在线观看视频| 337p粉嫩大胆噜噜噜鲁| 免费观看亚洲视频| 2022中文字幕| 一道本视频在线观看| 亚洲一区 在线播放| 永久av免费在线观看| 超碰在线播放91| 久久精品免费一区二区| 性久久久久久久久久久久久久| 国产一级片黄色| 欧美国产日韩在线播放| 日本三级免费观看| 无码aⅴ精品一区二区三区浪潮| 自拍偷拍视频在线| 日本一本二本在线观看| 免费一区二区三区在线观看| 精品人妻大屁股白浆无码| 女同性恋一区二区| 污污的视频免费观看| 精品国产一区三区| 日本男人操女人| 久久九九国产视频| 色婷婷综合久久久久中文字幕| 又大又硬又爽免费视频| 高清无码一区二区在线观看吞精| 国产精品自拍片| xxxx一级片| 激情五月俺来也| 久久综合九色综合88i| 国产欧美高清在线| www激情五月| 亚洲午夜精品一区| 欧美精品一区二区三区免费播放| 日韩福利视频在线| 久久综合久久色| 超碰在线免费av| 毛片av免费在线观看| 大j8黑人w巨大888a片| av网站大全免费| 任你操这里只有精品| av免费观看大全| 成年人观看网站| 国产一区二区三区播放| 国产精品久久久久9999小说| 蜜臀一区二区三区精品免费视频| 9色视频在线观看|