Oracle通过DBLink访问CLOB类型字段报错ORA-22992的解决方案

DBLink 中,对于普通字段按常规方法查询即可,但是对于 CLOB 字段的处理相对比较麻烦, CLOB 为大字段,通常 VARCHAR 最大只支持到 4000 字符。在按常规方法查询时会有以下结果:

SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from [email protected] DBLINK,其中 “TRANSFORM_CHANGE_CONTENT” 为 CLOB 字段,会报 “ORA-22992: cannot use LOB locators selected from remote tables” 的错误。

常规的处理方法有以下两种:

1.      采用临时表方式实现对 LOB 字段的选取: 
创建一个临时表 “create global temporary table TMP_TB( 
MODE_CODE VARCHAR2(16), 
TRANSFORM_CHANGE_CONTENT CLOB 
)on commit delete rows;” , 
再执行 “INSERT INTO TMP_TB SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from [email protected] DBLINK;” 后,临时表中就将对应的数据选取过来了,最后再通过执行 “SELECT * from TMP_TB;” ,即可查看到结构。

2.      采用将 CLOB 转换为 VARCHAR 的方式实现: 
首先需要用到函数 “dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte );” 
通过创建如下视图: 
CREATE OR REPLACE VIEW DBLINK_V AS 
  SELECT MODE_CODE, dbms_lob.substr(TRANSFORM_CHANGE_CONTENT,4000,1) TRANSFORM_CHANGE_CONTENT 
    FROM TABLE 
通过执行 “SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from DBLINK_V @DBLINK;” ,即可实现查看到结果

结论,方法 1 中也可以使用普通表,但使用的临时表效率要高于普通表,这里不做过多讨论;方法 2 中创建视图的效率要远高于方法 1 ,时间上看方法 1 大于方法2 的几倍左右。

原文地址:https://www.cnblogs.com/nietzsche2019/p/11274728.html

时间: 2024-11-09 19:48:52

Oracle通过DBLink访问CLOB类型字段报错ORA-22992的解决方案的相关文章

oracle中Blob和Clob类型的区别

一.oracle中Blob和Clob类型的区别BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的.其实两个是可以互换的的,或者可以直接用LOB字段代替这两个.但是为了更好的管理ORACLE数据库,通常像图片.文件.音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去.而像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新存储等操作都提供很大的方便. BLOB全称为二进制大型对象(Binary Large Object).它用于存储数据

Mysql 升级到 5.6 后插入语句时间字段报错:Incorrect datetime value: '' for column 'createtime'

今天部署服务器项目运行,当遇见有时间数据对象的插入和更新操作的时候,就报错,如下: Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'createtime' at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2868) at com.mysql.jdbc.My

Mybatis Plus 更新时间 updateTime字段报错 Could not set property 'updateTime'

背景 遇到这个问题折腾好几个小时,差点被逼疯.记录一下. 先说下环境,MySQL数据库,表中字段名为update_time,类型为datetime.Java实体类中对应的变量是java.util.Date类型的updateTime. 环境交代完毕,使用update语句更新记录的时候,一直报错,说类型不匹配.贴上报错信息: 1 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.refle

Oracle EBS-SQL (MRP-7):检查MRP计划运行报错原因之超大数据查询2.sql

The following scripts can be used to check for huge line numbers: -- PO Requisitions select * from PO_REQUISITION_LINES_ALL where LINE_NUM > 1000000000; -- PO Lines select * from PO_LINES_ALL where LINE_NUM > 1000000000; -- Receiving Supply SELECT *

#定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。

1 #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). 2 def get_num(num): 3 if type(num)!= list: 4 return '您传入的不是列表!' 5 else: 6 for i in num: 7 if not isinstance(i,int): 8 return '请全部传入整数!' 9 return list(filter(lambda x:x

Oracle 使用scott用户 set utotrace on报错 SP2-0618,SP2-0611

.vdi :virtualbox默认的虚拟硬盘文件格式 .vdmk:vmware默认的虚拟硬盘文件格式 .vhd:微软virtualPC默认的虚拟硬盘文件格式 .hdd:parallel desktop默认的虚拟硬盘文件格式 Oracle 使用scott用户 set utotrace on报错 SP2-0618,SP2-0611

C# 访问数据的时候报错 (拒绝了对对象 'XXXX' (数据库 'SHQY',架构 'dbo')的 SELECT 权限)

拒绝了对对象 'XXXX' (数据库 'SHQY',架构 'dbo')的 SELECT 权限 解决办法 use [docareMZ]--docareMZ 数据库名 GO GRANT SELECT ON SCHEMA::[dbo] TO [public] --查 use [docareMZ] GO GRANT EXECUTE ON SCHEMA::[dbo] TO [public] C# 访问数据的时候报错 (拒绝了对对象 'XXXX' (数据库 'SHQY',架构 'dbo')的 SELECT

访问kubernetes dashboard UI报错

访问kubernetes dashboard UI报错Error: 'dial tcp 10.0.66.2:9090: getsockopt: connection timed out'Trying to reach: 'http://10.0.66.2:9090/' 原因是master节点和node节点flannel 的网络通信有问题解决方法: 依次重启master和node节点flannelsystemctl restart flanneld 原文地址:http://blog.51cto.c

mysql 插入中文字段报错 "Incorrect string value: '\\xE6\\xB5\\x8B\\xE8\\xAF\\x95...' for column 'title' at row 1"

1. 查看一个 database 或一个 table 的编码show create database mytestdb;show create table testapp_article; mysql> show create table testapp_article;+-----------------+-----------------------------------------------------------------------------------------------