oracle的long型別欄位的應用-- 知識篇
精華總結:
我們現在設計的應用系統最好禁用LONG型別,因為限制太多了(尤其是LONG型別不支援CTAS,INSERT INTO..SELECT ..,)可以說是“一個。。。壞了一鍋粥!”
,在做資料遷移時,真是災難呀!。。(。—。。—。)。。
不過,還是有救命稻草的,那就是——使用CURSOR一行一行地往裡插——哈,真的很難理解ORACLE的想法,為什麼INSERT VALUES方式就可以而INSERT SELECT 就不行。
下一篇會詳細介紹這種實現方法及技巧(當然是效能最佳化技巧了)。
refs:
1、LONG 資料型別中儲存的是可變長字串,最大長度限制是2GB。
2、對於超出一定長度的文字,基本只能用LONG型別來儲存,資料字典中很多物件的定義就是用LONG來儲存的。
3、LONG型別主要用於不需要作字串搜尋的長串資料,如果要進行字元搜尋就要用varchar2型別。
4、很多工具,包括SQL*Plus,處理LONG 資料型別都是很困難的。
5、LONG 資料型別的使用中,要受限於磁碟的大小。
能夠操作 LONG 的 SQL 語句:
1、Select語句
2、Update語句中的SET語句
3、Insert語句中的VALUES語句
限制:
1、一個表中只能包含一個 LONG 型別的列。
2、不能索引LONG型別列。
3、不能將含有LONG型別列的表作聚簇。
4、不能在SQL*Plus中將LONG型別列的數值插入到另一個表格中,如insert into …select。
5、不能在SQL*Plus中透過查詢其他表的方式來建立LONG型別列,如create table as select。
6、不能對LONG型別列加約束條件(NULL、NOT NULL、DEFAULT除外),如:關鍵字列(PRIMARY KEY)不能是 LONG 資料型別。
7、LONG型別列不能用在Select的以下子句中:where、group by、order by,以及帶有distinct的select語句中。
8、LONG型別列不能用於分佈查詢。
9、PL/SQL過程塊的變數不能定義為LONG型別。
10、LONG型別列不能被SQL函式所改變,如:substr、instr。
因為long型別的數值不能用insert into … select的方法插入,故我們要分兩步走,先插入其它欄位,最後再插入long型別欄位,這可以透過過程來實現.下面是一個我做實驗實現的例子.
SQL>; create table testlong (id number,name varchar2(12),history long);
表已建立。
SQL>; create table testlong1 (id number,name varchar2(12),history long);
表已建立。
SQL>; insert into testlong values(1,’tslxg’,'work in tangshan’);
已建立 1 行。
SQL>; insert into testlong values(2,’imakee’,'work in beiing’);
已建立 1 行。
SQL>; select * from testlong;
ID NAME
———- ————————
HISTORY
——————————————————————————–
1 tslxg
work in tangshan
2 imakee
work in beijing
SQL>; insert into testlong1 select * from testlong;
insert into testlong1 select * from testlong
*
ERROR 位於第 1 行:
ORA-00997: 非法使用 LONG 資料型別
SQL>; Declare
2 CURSOR bcur
3 IS SELECT id,history from testlong;
4 brec bcur%ROWTYPE;
5 BEGIN
6 insert into testlong1(id,name) select id,name from testlong;–其它型別
先插入
7 OPEN bcur;
8 LOOP
9 FETCH bcur INTO brec;
10 EXIT WHEN bcur%NOTFOUND;
11 update testlong1 set history=brec.history where id=brec.id;
12 END LOOP;
13 CLOSE bcur;
14 END;
15 /
PL/SQL 過程已成功完成。
SQL>; select * from testlong1;
ID NAME
———- ————————
HISTORY
————————————————————————–
1 tslxg
work in tangshan
2 imakee
work in beijing
LONG列不能出現在SQL語句的某些部分:
1、在WHERE、GROUP BY、ORDER BY、CONNECT BY子句以及在具有DISTINCT 操作的SELECT語句中。
2、SQL函式(如SUBSTR或INSTR)
3、表示式或條件。
4、包含有GROUP BY子句的查詢的選擇表。
5、在子查詢的選擇表或由集合操作組合查詢選擇表。
6、CREATE TABLE AS SELECT語句的選擇表。
使用說明:
1、LONG 資料型別中儲存的是可變長字串,最大長度限制是2GB。
2、對於超出一定長度的文字,基本只能用LONG型別來儲存,資料字典中很多物件的定義就是用LONG來儲存的。
3、LONG型別主要用於不需要作字串搜尋的長串資料,如果要進行字元搜尋就要用varchar2型別。
4、很多工具,包括SQL*Plus,處理LONG 資料型別都是很困難的。
5、LONG 資料型別的使用中,要受限於磁碟的大小。
能夠操作 LONG 的 SQL 語句:
1、Select語句
2、Update語句中的SET語句
3、Insert語句中的VALUES語句
限制:
1、一個表中只能包含一個 LONG 型別的列。
2、不能索引LONG型別列。
3、不能將含有LONG型別列的表作聚簇。
4、不能在SQL*Plus中將LONG型別列的數值插入到另一個表格中,如insert into …select。
5、不能在SQL*Plus中透過查詢其他表的方式來建立LONG型別列,如create table as select。
6、不能對LONG型別列加約束條件(NULL、NOT NULL、DEFAULT除外),如:關鍵字列(PRIMARY KEY)不能是 LONG 資料型別。
7、LONG型別列不能用在Select的以下子句中:where、group by、order by,以及帶有distinct的select語句中。8、LONG型別列不能用於分佈查詢。
9、PL/SQL過程塊的變數不能定義為LONG型別。
10、LONG型別列不能被SQL函式所改變,如:substr、instr。
利用oracle long型別欄位,插入大文字
在編寫應用時,需要大量的插入大文字,但是oracle 的clob操作起來比較繁瑣,應此我沒有選擇使用clob,而是使用了oracle以前版本中的long型別[但是long型別有一些限制,在一個表中只能有一個long欄位]。
開始的時候我直接使用insert into table1 values(a,b[long])的方式插入資料庫,但是oracle有些限制一條語句不能超過4000個字元,並報ORA-01704的錯誤。
經過查詢oracle 的文件找到了解決的方法,就是對於long的欄位使用setCharacterStream()方法將String插入資料庫。
程式碼:
sql=”insert into msg_info values (?,?,?,?[long型別欄位],’C',sysdate,sysdate+”+msgterm+”,?)”;
pstat1 = conn.prepareStatement(sql);
pstat1.setLong(1, msg_id);
pstat1.setInt(2, msg_gp_id);
pstat1.setString(3, msg_title);
pstat1.setCharacterStream(4,new StringReader(msg_info.toString()),msg_info.length());
conn.commit();
pstat1.setLong(5, this.upid);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/350519/viewspace-1048445/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle的long型別欄位的應用-- 實戰篇Oracle型別
- 含LONG型別欄位的表無法MOVE型別
- oracle的欄位型別Oracle型別
- LONG欄位型別向CLOB遷移型別
- MYSQL SET型別欄位的SQL操作知識介紹MySql型別
- oracle 修改欄位型別的方法Oracle型別
- LONG RAW的欄位型別不能使用impdp + dblink遷移型別
- Oracle user_tab_partitions.high_value欄位 LONG型別 讀取的幾種方法Oracle型別
- oracle裡long型別的總結Oracle型別
- Java long型別和Long型別的那些事Java型別
- 修改表的欄位型別型別
- 轉載:Oracle常用的資料庫欄位型別Oracle資料庫型別
- Oracle 修改欄位型別和長度Oracle型別
- MongoDB中的欄位型別IdMongoDB型別
- Oracle Long型別轉換為Clob型別Oracle型別
- 如何將varchar2修改為clob型別欄位(使用long過渡)型別
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- oracle裡long型別詳解Oracle型別
- 個人知識管理-應用篇
- 修改欄位資料型別的方法資料型別
- MongoDB更改欄位型別MongoDB型別
- ORACLE MYSQL中join 欄位型別不同索引失效的情況OracleMySql型別索引
- int型別和long long型別運算執行時間的差別型別
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- 主流資料庫欄位型別轉.Net型別的方法資料庫型別
- Sqlserver修改線上表的表欄位型別SQLServer型別
- 改變表中非空欄位的型別型別
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- sql語句修改欄位型別和增加欄位SQL型別
- 多型關聯自定義的型別欄位的處理多型型別
- MySQL欄位型別最全解析MySql型別
- date、timestamp欄位型別型別
- MySQL欄位型別小記MySql型別
- 資料欄位型別匹配型別
- sqlite sql 修改欄位型別SQLite型別
- oracle檢視該使用者的所有表名字、表註釋、欄位名、欄位註釋、是否為空、欄位型別Oracle型別
- Oracle-不刪表資料,修改欄位型別Oracle型別