long型別轉換成varchar2

jolly10發表於2012-08-06

long型別有很多限制,多得不得多,幾乎沒法用。公司有一個表之前定義成long了,現在要改過來。

在網上找到了一個方法:

[@more@]

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。

轉換步驟:

1:建立jivemsg2表:
CREATE TABLE "JIVEMSG2"
( "URI" VARCHAR2(100 BYTE) DEFAULT '' NOT NULL ENABLE,
"SENDER" VARCHAR2(100 BYTE) DEFAULT '',
"RECEIVER" VARCHAR2(100 BYTE) DEFAULT '',
"CREATIONDATE" VARCHAR2(15 BYTE) DEFAULT '',
"MESSAGETYPE" VARCHAR2(100 BYTE) DEFAULT '',
"MESSAGESIZE" NUMBER(*,0) DEFAULT 0,
"MESSAGE" LONG,
"FKDOMAIN" VARCHAR2(20 BYTE) DEFAULT NULL,
"VERSION" VARCHAR2(20 BYTE) DEFAULT NULL,
"FLAGS" VARCHAR2(20 BYTE) DEFAULT NULL,
"RECEIVERNAME" VARCHAR2(50 BYTE) DEFAULT NULL,
"SENDERNAME" VARCHAR2(50 BYTE) DEFAULT NULL,
CONSTRAINT "JIVEMSG2_PK" PRIMARY KEY ("URI")
);
2:修改表jivemsg2的型別
ALTER TABLE JIVEMSG2 MODIFY ("MESSAGE" VARCHAR2(4000 CHAR));

3:將表jivemsg中的資料匯入到表jivemsg2中
這步是關鍵,由於long型別不能直接轉換成varchar2。
所以這邊用了一個別人寫的function來解決。

INSERT INTO JIVEMSG2 select uri,sender,receiver,creationdate,messagetype,messagesize, long_to_char(rowid,'ucstar6','jivemsg','message'),fkdomain,version,flags,receivername,sendername from jivemsg msg;


函式:
/* 其中in_rowid為行id,in_owner為資料庫登陸的帳號名,in_table_name為資料庫表名,in_column為資料庫對應long型別的表欄位名稱 */
CREATE OR REPLACE FUNCTION LONG_TO_CHAR( in_rowid rowid,in_owner
varchar,in_table_name varchar,in_column varchar2)
RETURN varchar AS
text_c1 varchar2(32767);
sql_cur varchar2(2000);
--
begin
sql_cur := 'select '||in_column||' from
'||in_owner||'.'||in_table_name||' where rowid =
'||chr(39)||in_rowid||chr(39);
dbms_output.put_line (sql_cur);
execute immediate sql_cur into text_c1;

text_c1 := substr(text_c1, 1, 4000);
RETURN TEXT_C1;
END;
/

4:刪除表jivemsg,並將jivemsg2更名為jivemsg
DROP TABLE jivemsg;
RENAME JIVEMSG2 TO jivemsg;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1059094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章