zoukankan      html  css  js  c++  java
  • Oracle通过DBLink访问CLOB类型字段报错ORA-22992的解决方案

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

    SELECT MODE_CODE,TRANSFORM_CHANGE_CONTENT from TABLE@ 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 TABLE@ 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 的几倍左右。

  • 相关阅读:
    js4——字符转化
    js3——表格下拉
    笔记展现
    js2——定时跳转
    js学习——1
    明明在/etc/my.cnf 配置了mysql.sock,为什么会在/var/lib/mysql/mysql.sock 里边寻找
    RBAC用户权限管理数据库设计
    mysql 字节问题,中文和数字
    PHP闭包
    一致性哈希算法原理
  • 原文地址:https://www.cnblogs.com/nietzsche2019/p/11274728.html
Copyright © 2011-2022 走看看