设为首页 收藏本站
查看: 843|回复: 0

[经验分享] (转)ORACLE LONG类型转化成VARCHAR2

[复制链接]

尚未签到

发表于 2016-7-29 06:43:43 | 显示全部楼层 |阅读模式
  Oracle中强烈不推荐用long类型,但是为了解燃眉之急,被迫用了long类型,简单啊,直接insert就行了。不过,没有想到long类型不支持Like,也不能直接to_char。 
后悔了,想将long改回varchar2类型,但是又不能直接修改,否则会报错,提醒必须要清空数据,为了不清空数据,综合网上的资料总结了以下解决方案: 
表jivemsg中的message类型long需要替换成varchar2: 

原jivemsg表结构: 
CREATE TABLE "JIVEMSG" 
   ( "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 "JIVEMSG_PK" PRIMARY KEY ("URI") 
   ); 

------------------------------------------------------------------------- 

转换步骤: 

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; 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250782-1-1.html 上篇帖子: Oracle数据库相关名词解释 下篇帖子: Database Wait Statistics – Oracle Database 10g
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表