当前位置: 首页 > news >正文

Oracle Long类型转换为Clob类型

INSERT INTO sammy_test_clob
   SELECT TO_LOB (report_xml)
     FROM qm_s_report
    WHERE report_name = 'Sammy';


TO_LOB
函数和LONG类型一样,限制有很多。简单的说,TO_LOB一般只用在CREATE TABLEINSERT TABLE语句后面的子查询中。在其他地方使用会报错,比如UPDATE语句。

这还不是最大的问题,最大的问题在于,TO_LOB函数似乎并没有真正的将LONG类型转化为LOB数据类型。个人感觉,Oracle只是对LONG类型做了一些处理,使之可以存放到一个LOB类型中去。



转自: http://blog.csdn.net/gbnew/archive/2007/07/20/1700596.aspx

TO_LOB函数是一个很特殊的函数,特殊之处在于,这个函数可以处理LONG类型数据,而且这个函数和LONG类型一样,拥有很多的限制。不过,这些还不是很特殊的地方,下面简单看一下TO_LOB这个函数。

 


OracleLONG类型可谓“臭名昭著”,由于LONG类型的限制太多,以至于Oracle很少去提LONG类型有哪些限制条件,而一般都是通过说明在哪些情况下,可以使用LONG类型。

正是这些限制阻止了LONG的使用,Oracle也在推出了大对象类型——LOB之后,强烈建议用户不要在使用LONG类型。

但是,具有讽刺意味的是,Oracle建议用户不要再使用LONG类型,可是数据字典中,随处可以看到LONG的身影。而且,即使是目前使用的最高版本10R2LONG类型仍然在数据字典中随处可见。不知道Oracle是考虑兼容性的问题还是其他什么原因,反正Oracle仍然没有把LONG类型从数据字典中移出去。不知道11g中是否有所改观。

虽然Oracle自己没有做到,但是仍然建议用户不要在使用LONG,并使用BLOBCLOB来替换现有系统中的LONG字段。而且LONG类型的限制也确实使人头疼,将LONG类型转化为LOB类型的工具,就是TO_LOB函数。

TO_LOB函数和LONG类型一样,限制有很多。简单的说,TO_LOB一般只用在CREATE TABLEINSERT TABLE语句后面的子查询中。在其他地方使用会报错,比如UPDATE语句。

这还不是最大的问题,最大的问题在于,TO_LOB函数似乎并没有真正的将LONG类型转化为LOB数据类型。个人感觉,Oracle只是对LONG类型做了一些处理,使之可以存放到一个LOB类型中去。

SQL> CREATE TABLE T1 (ID NUMBER, TEXT CLOB);

表已创建。

SQL> CREATE TABLE T2 (ID NUMBER, TEXT VARCHAR2(4000));

表已创建。

SQL> INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*
1 行出现错误:
ORA-00997: illegal use of LONG datatype


SQL> INSERT INTO T1 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;

已创建2268行。

SQL> COMMIT;

提交完成。

使用TO_LOB可以将LONG数据插入到CLOB字段中,但是如果想要将LONG数据插入到VARCHAR2中:

SQL> INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*
1 行出现错误:
ORA-00997: illegal use of LONG datatype


SQL> INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS
*
1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got LONG

直接插入肯定不行,但是刚才已经得到了CLOB类型,那么将CLOB转化为VARCHAR2不就可以了?但是结果确出人意料。观察错误信息,Oracle认为返回的数据类型是LONG。似乎TO_LOB并没有进行数据类型的转化。下面再验证一下:

SQL> SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS;
SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS
*
1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got LONG


SQL> SELECT DUMP(TEXT) FROM T1;
SELECT DUMP(TEXT) FROM T1
*
1 行出现错误:
ORA-00932: inconsistent datatypes: expected - got CLOB

从这个对比中已经可以清楚的看到,TO_LOB函数并不像想象中的那样返回CLOB类型,而实际上返回的仍然是LONG类型。

SQL> INSERT INTO T2 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;

已创建2268行。

直接使用TO_LOB似乎可以插入,但是仔细对比一下结果就会发现,LONG类型数据没有真正的插入到表中:

SQL> COL TEXT FORMAT A50
SQL> SET LONG 50
SQL> SELECT * FROM T2 WHERE ROWNUM < 3;

ID TEXT
---------- --------------------------------------------------
1
2

SQL> SELECT * FROM T1 WHERE ROWNUM < 3;

ID TEXT
---------- --------------------------------------------------
1 select OWNER, TABLE_NAME, TABLESPACE_NAME, CLUSTER
2 select a.apply_name, a.queue_name, a.queue_owner,

 

 

相关文章:

  • 三维模型逐渐透明化
  • [转]奇文-闲话操作系统(1/4)
  • 如何得到需要下载文件的链接(路径)?
  • 同网段存活IP公钥分发脚本
  • javascript小技巧
  • vue
  • go关键字之struct定义声明方式
  • linux环境变量配置
  • Embed Youtube or Not
  • 用postman模拟ajax发送json数据的笔记
  • 心情随感
  • NABCD分析
  • 一步一步SharePoint 2007之二:配置SharePoint
  • 算法51----斐波那契【动态规划】
  • 羊皮卷的实践-第二十四章
  • C# 免费离线人脸识别 2.0 Demo
  • Docker 笔记(2):Dockerfile
  • ES10 特性的完整指南
  • iOS 系统授权开发
  • JavaScript中的对象个人分享
  • JS题目及答案整理
  • LeetCode18.四数之和 JavaScript
  • MD5加密原理解析及OC版原理实现
  • pdf文件如何在线转换为jpg图片
  • Python_网络编程
  • Python中eval与exec的使用及区别
  • Sass Day-01
  • Web设计流程优化:网页效果图设计新思路
  • 笨办法学C 练习34:动态数组
  • 多线程事务回滚
  • 前端性能优化--懒加载和预加载
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • !!java web学习笔记(一到五)
  • #etcd#安装时出错
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (转)详解PHP处理密码的几种方式
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NetCore部署微服务(二)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48