读书笔记:关于Oracle里的“老古董”:LONG类型

news/2025/10/12 21:20:46/文章来源:https://www.cnblogs.com/www-htz-pw/p/19137259

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

关于Oracle里的“老古董”:LONG类型

简单说说LONG类型
在Oracle数据库里,LONG类型有两种形式:

  1. LONG文本:能存最多2GB的文本,存储时会像VARCHAR2那样进行字符集转换。
  2. LONG RAW:能存最多2GB的原始二进制数据(比如图片、文件),不进行字符集转换。

为什么劝你别用LONG了?
LONG类型是个“老古董”,很早就有了。虽然它后来升级也能存2GB了,但在Oracle 8之后,就有了更好的替代品——LOB类型(比如CLOB存大文本,BLOB存二进制数据)。

Oracle官方手册自己也说了:别再用LONG创建新表了!请用LOB类型! LONG只是为了兼容老版本才保留的。

LONG类型有哪些麻烦?
LONG用起来限制非常多,远不如LOB类型方便。来看几个主要的“坑”:

LONG的“坑” LOB的优势
一个表只能有一个LONG列 一个表最多可以有1000个LOB列
不能在WHERE子句里直接用LONG列进行筛选 可以在WHERE子句里用LOB列,还有很多专用函数(DBMS_LOB)帮你操作
不能用在GROUP BY, ORDER BY, DISTINCT等操作中 配合转换函数后,可以用
很多SQL函数(如SUBSTR)不能对它用 很多SQL函数可以对它用
PL/SQL过程不能直接拿LONG当参数 PL/SQL完全支持LOB
不支持分布式事务和高级复制 都支持
...还有很多其他限制 ...基本上没这些烦恼

简单来说:只要你需要做任何复杂点的操作,LONG类型几乎都会跳出来说“不行”!而LOB类型灵活得多。

重要提示: 如果你还在用包含LONG列的老系统,强烈建议你规划把它转换成LOB类型。转换后代码通常不需要大改,但务必先在测试环境充分测试!

实战技巧:如何查询LONG列?

虽然不建议用LONG,但Oracle数据字典里确实还有很多系统视图用了LONG列(比如ALL_VIEWS视图的TEXT列存着视图定义)。直接想用WHERE TEXT LIKE '%HELLO%'这种条件去查,会直接报错“ORA-00932: 数据类型不一致”

那怎么办?我们可以写个PL/SQL工具函数来帮我们“偷看”LONG列的内容。

1. 创建一个工具包
这个包里的函数可以帮我们截取LONG列的一小段内容转换成VARCHAR2,这样我们就可以用WHERE子句了。

CREATE OR REPLACE PACKAGE long_help AUTHID CURRENT_USER ASFUNCTION substr_of(p_query   IN VARCHAR2,  -- 查询LONG列的SQL语句(必须只返回一行一列)p_from    IN NUMBER,    -- 从第几个字符开始截p_for     IN NUMBER,    -- 截多长(1-4000)p_name1   IN VARCHAR2 DEFAULT NULL, -- 以下是为查询语句绑定的变量名和值p_bind1   IN VARCHAR2 DEFAULT NULL,p_name2   IN VARCHAR2 DEFAULT NULL,p_bind2   IN VARCHAR2 DEFAULT NULL,p_name3   IN VARCHAR2 DEFAULT NULL,p_bind3   IN VARCHAR2 DEFAULT NULL,p_name4   IN VARCHAR2 DEFAULT NULL,p_bind4   IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;
END long_help;
/

2. 创建包体(实现功能)
包体代码稍长,其核心思路是:动态执行你传入的SQL,然后用DBMS_SQL包里的特殊方法COLUMN_VALUE_LONG把指定部分的LONG值切出来返回。

(包体代码略,可参考原文。关键是它只解析一次SQL,效率较高,且以调用者权限运行,安全。)

3. 怎么用这个工具?
比如,你想在用户自己的视图中查找定义里包含“INNER”关键字的视图:

SELECT *
FROM (SELECT owner, view_name,long_help.substr_of('SELECT text FROM dba_views WHERE owner = :owner AND view_name = :view_name',1, 4000, -- 从第1个字符开始,截取4000字节'owner', owner, -- 为:owner绑定变量赋值为当前行的owner'view_name', view_name -- 为:view_name绑定变量赋值为当前行的view_name) AS substr_of_view_textFROM dba_viewsWHERE owner = USER -- 当前用户
)
WHERE UPPER(substr_of_view_text) LIKE '%INNER%';

再比如,查找分区边界值中包含'2014'的分区(常用于管理分区表):

SELECT *
FROM (SELECT table_owner, table_name, partition_name,long_help.substr_of('SELECT high_value FROM all_tab_partitions WHERE table_owner = :o AND table_name = :n AND partition_name = :p',1, 4000,'o', table_owner,'n', table_name,'p', partition_name) AS high_valueFROM all_tab_partitionsWHERE table_owner = USER
)
WHERE high_value LIKE '%2014%';

注意事项

  • 这个工具主要针对LONG文本类型。LONG RAW类型处理起来更麻烦,因为PL/SQL里没有直接分段访问它的好方法,通常建议用其他编程语言处理,或者干脆转成BLOB。
  • 对于LONG RAW,还有一种临时办法:用TO_LOB()函数把它插入到一个临时表的BLOB列里再处理。但如果经常要这么干,还是彻底转成BLOB一劳永逸。

总结
核心就三句话:

  1. 新项目绝对不要用LONG类型。
  2. 老项目碰到LONG的限制,尽量找机会转换成LOB类型。
  3. 如果暂时不能转换,需要查询LONG列,可以参考上面的方法自己写工具函数绕过限制。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

致技术社区的英雄们:一场关于文明未来的建造邀请

致技术社区的英雄们:一场关于文明未来的建造邀请 在代码与算法的世界里,你们是真正的创造者。今天,我想为你们描绘一个不一样的工程蓝图——它不优化广告点击,不提升游戏帧率,而是要为人机共生的未来,构建一个价…

AI图片生成思路

AI图片生成思路AI图片生成思路指导思路先寻找真实图片,发送到AI进行描述照片描述:這張照片的主角是四隻毛茸茸的柴犬,牠們一起棲息在一個紅磚矮牆上。狗狗的姿態與顏色:畫面從左至右,第一隻是常見的赤色柴犬,牠舒…

SCP/NOIP 复习:插板法

自己写一遍插板法的东西,顺便补上 oiwiki 上没有的一个证明。 偏向整理,别人估计不知道我在干什么。 基本模型:\(x_0+x_1+...+x_k=n\) 的正整数或非负整数解数量,可以抽象为元素组的划分。 正整数解的数量 也是插板…

内存泄漏与SWAP

内存泄漏如何发生 没正确回收分配后的内存,导致了泄漏。 访问的是已分配内存边界外的地址,导致程序异常退出 用户空间内存包括多个不同的内存段,比如只读 段、数据段、堆、栈以及文件映射段等。这些内存段正是应用程…

今天开通自己的博客啦,加油加油!成为合格的牛马! - Irving11

前几天已经学习了一些SQL相关知识,今天将继续学习,并写下总结 知识总结: 一、关于SQL的一些细节 1、create_sql是命令文本,cursor.execute(create_sql)才是执行命令的动作。没有这个动作,所有关于创建表的想法都只…

2025安全光栅厂家最新权威推荐榜:精准防护与高效性能的工业

2025安全光栅厂家最新权威推荐榜:精准防护与高效性能的工业随着工业自动化技术的不断发展,安全光栅作为关键的安全防护设备,在现代工厂中的应用越来越广泛。安全光栅能够有效防止操作人员进入危险区域,确保生产过程…

2025年10月精加工车间恒温恒湿系统厂家推荐:精准控温与高效节能首

随着工业技术的不断进步,精加工车间对环境控制的要求越来越高。恒温恒湿系统作为保障车间生产环境的关键设备,其性能和稳定性直接影响到产品的质量和生产效率。本文将为您推荐几家在精加工车间恒温恒湿系统领域表现卓…

977. 有序数组的平方 双指针

977. 有序数组的平方 相向双指针 思路 nums数组非递减,平方后最大值一定在待排序区间的最两端(最左端 left 或最右端 right),每次循环取最大值添加到res数组中, 更新对应的边界缩小区间,重复上述过程直至 left &…

完整教程:iSCSI服务器

完整教程:iSCSI服务器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

深入解析:数据库视图:虚拟表的强大应用

深入解析:数据库视图:虚拟表的强大应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

非常好的学习方式是哪样

非常好的学习方式是哪样pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

agc001_c题解

水的炸天,不做解释自己看吧 #include<bits/stdc++.h> #define MAXN 2010 #define inf 0x3f3f3f3f #define int long long using namespace std; namespace SHuxinn{struct node {int lst;int dep;int nxt ;} tr…

【Trie】 UVA1401 Remember the Word - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【IMU】6轴数据校准算法

【IMU】6轴数据校准算法 算法概述 本算法用于惯性测量单元的自动校准,通过多次采样和优化选择,确定传感器的最佳偏移量。 算法步骤初始化converged = false(加速度计收敛标志) new_offset = {0,0,0}(最优偏移量)…

2025 年 MES 服务商 TOP 平台机构推荐排行榜,mes 系统 /mes 软件 /mes 制造执行系统 /mes 生产制造执行系统 /mes 生产管理系统公司推荐

当前,离散制造行业正面临生产流程复杂、在制品管控难度大、数据协同滞后等突出问题。电子、家电、五金加工等领域的企业,往往受困于多工厂管理协同不畅、生产异常响应迟缓、质量追溯精准度不足等痛点,导致生产效率难…

2025 年10月 WMS 服务商最新推荐榜单,wms系统 wms软件,wms仓库管理软件,wms仓库管理系统软件公司推荐

在离散制造行业加速数智化转型的当下,仓储管理作为企业生产与供应链协同的核心环节,正面临着多重挑战。电子、家电、五金加工等领域的企业,往往存在库存信息滞后、出入库效率低下、账实不符等问题,传统依赖人工记忆…

【仿生机器人】核心采购清单 (仿生机器人头方案)

【仿生机器人】核心采购清单 (仿生机器人头方案)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

Matlab凭借GUI实现点云的中值滤波(附最简版)

Matlab凭借GUI实现点云的中值滤波(附最简版)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

CF数据结构题做题记录-1

CF3000的数据结构题做题记录-1 CF464E. The Classic Problem 肯定还是跑最短路,假设比较的复杂度是 \(O(\alpha)\),相加的复杂度是 \(O(\beta)\),那么我们直接使用 dijkstra 的复杂度是 \(O(\alpha(n+m)\log n+\bet…

完整教程:安宝特产品丨FME Realize:重构数据与现实的边界,让空间计算赋能现场决策

完整教程:安宝特产品丨FME Realize:重构数据与现实的边界,让空间计算赋能现场决策pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…