一、Oracle中的varchar2类型
1.我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。
2.在Oracle Database中,VARCHAR2 字段类型,最大值为4000;PL/SQL中 VARCHAR2 变量类型,最大字节长度为32767。
3.当VARCHAR2容纳不下我们需要存储的信息时,就出来的Oracle的大数据类型LOB(Large Object,大型对象)。
二、Oarcle中的LOB类型
1.在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。
2.LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。
3.而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
三、DB中使用CLOB类型字段
(一)创建表(使用sql或者直接在PL/SQL客户端创建),字段类型CLOB

-- Create table
create table TEMP
(
name VARCHAR2(200),
age NUMBER,
temp_clob CLOB
)
tablespace INSIGHTDATA3_TS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 160K
next 1M
minextents 1
maxextents unlimited
);

(二)增删改查
先看一下使用普通方式操作CLOB类型:

SELECT t.name, t.temp_clob FROM temp t; --普通查询 INSERT INTO temp t VALUES ('Grand.Jon', 22, '加入博客园的第一天');

查询因为不是varchar2类型,所以普通查询看不到CLOB类型的字段内容,结果如下:

而普通插入操作也会因为Oracle的隐式转换,默认把字符串转换成varchar2类型,一旦字符串内容超过varchar2的最大限度就会报会报ora-01704(字符串太长)错误。
正确操作

--使用PL/SQL语法,采取绑定变量的方式解决,而不是直接拼接SQL
DECLARE
V_LANG CLOB := '待插入的海量字符串'; V_UPDATE CLOB := '更新的海量字符串';
BEGIN
INSERT INTO temp t VALUES ('Grand.Jon', 22, V_LANG); --增加 UPDATE temp t SET t.temp_clob = V_UPDATE WHERE rownum = 1; --修改 SELECT t.NAME, dbms_lob.substr(t.temp_clob) FROM TEMP t; --查询  将CLOB转成字符类型 DELETE temp t WHERE rownum = 1; --按列删除 
 
COMMIT;
END;
/

查询结果如下:

对CLOB的操作我们在存储过程中基本上使用 DBMS_LOB包里面的方法。
dbms_lob 方法总结

dbms_lob.open() 打开LOB
dbms_lob.close() 关闭LOB
dbms_lob.append() 将源LOB中的内容追加到目标LOB
dbms_lob.copy() 从源LOB中的一部分或者全部数据复制到目标LOB
dbms_lob.erase() 删除LOB中全部或部分内容
dbms_lob.trim() 将LOB值减少到指定的长度
dbms_lob.read() 从LOB中读取数据
dbms_lob.write() 写入数据
dbms_lob.compare() 比较两个同种数据类型的LOB的部分或全部值是否相同
dbms_lob.getlength() 获取LOB的长度
dbms_lob.fileopen() 打开文件
dbms_lob.fileclose() 关闭文件
dbms_lob.fileexits() 检查文件的存在性
dbms_lob.createtemporary(V_SQL,true) 创建一个临时clob,用来存储拼接的sql
dbms_lob.write(v_SQL,'写入信息') 写入操作
dbms_lob.append(v_SQL,',') 拼接clob
dbms_lob.substr(v_SQL) 截取clob,不传参数就是全部读取
dbms_lob.freetemporary(v_SQL) 释放clob 

四、在存储过程中使用CLOB类型实例
需求:以开发的存储过程为例,需要循环遍历时间范围拼接sql,将时间日期按列反转(pivot),如果时间太长(1年以上)sql语句(varchar2)就会超出范围报错,这时候就需要使用CLOB来存储拼接的sql。

PROCEDURE P_AND_CPT_RATIOOTH_APP_BAK2_N(
V_APPIDS IN VARCHAR2,
V_TYPE IN VARCHAR2,
V_CHANNEL IN VARCHAR2,
V_TABLE IN VARCHAR2,
V_START IN VARCHAR2,
V_END IN VARCHAR2,
RESULT OUT mycursor
) IS V_SQL CLOB;
V_SQLWHERE VARCHAR2(32767) default '';
V_SQLWHERE_CHANNEL VARCHAR2(32767) default '';
V_SQL_DATES CLOB;
V_Sdate DATE;
V_Edate DATE;
V_TABLE_DATE VARCHAR2(50);
V_TABLE_TYPE VARCHAR2(50);
V_START_DATE VARCHAR2(50);
V_END_DATE VARCHAR2(50);
V_DAY VARCHAR2(50); BEGIN
select column_name into V_TABLE_DATE from user_tab_columns where table_name=''||V_TABLE||'' and column_id=1;
select column_name into V_TABLE_TYPE from user_tab_columns where table_name=''||V_TABLE||'' and column_id=5; dbms_lob.createtemporary(V_SQL,true);--创建一个临时lob
dbms_lob.createtemporary(V_SQL_DATES,true);--创建一个临时lob IF V_APPIDS is NOT NULL THEN
V_SQLWHERE := 'AND t.appid in ('||V_APPIDS||')';
END IF; IF V_CHANNEL IS NOT NULL THEN
V_SQLWHERE_CHANNEL := 'AND t.channel = '''||V_CHANNEL||'''';
END IF; IF V_TABLE_DATE = 'MON' THEN
V_START_DATE := SUBSTR(V_START,0,6);
V_END_DATE := SUBSTR(V_END,0,6);
v_sdate := to_date(V_START_DATE, 'yyyymm');
v_edate := to_date(V_END_DATE, 'yyyymm'); WHILE (v_sdate <= v_edate) LOOP
dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymm'));--把临时字符串付给v_str
IF v_sdate != v_edate THEN
dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
END IF;
v_sdate := add_months(v_sdate,1);
END LOOP;
ELSE --周和日 类型 都是 DAY
v_sdate := to_date(V_START, 'yyyymmdd');
v_edate := to_date(V_END, 'yyyymmdd');
V_END_DATE := V_END; IF SUBSTR(V_TYPE,0,1)='d' THEN
V_START_DATE := to_char(v_sdate, 'yyyymmdd');
WHILE (v_sdate <= v_edate) LOOP
dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymmdd'));--把临时字符串付给v_str
IF v_sdate != v_edate THEN
dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
END IF;
v_sdate := v_sdate+1;
END LOOP;
ELSIF SUBSTR(V_TYPE,0,1)='w' THEN
select to_char(V_Sdate,'d') INTO V_DAY from dual;
IF V_DAY!=2 THEN
V_Sdate:=V_Sdate-7;
END IF;
V_START_DATE := to_char(v_sdate, 'yyyymmdd');
WHILE (v_sdate <= v_edate) LOOP
select to_char(V_Sdate,'d') INTO V_DAY from dual;
IF V_DAY=2 THEN
dbms_lob.append(v_SQL_DATES,to_char(v_sdate, 'yyyymmdd'));--把临时字符串付给v_str
IF V_Edate-v_sdate >7 THEN
dbms_lob.append(v_SQL_DATES,',');--把临时字符串付给v_str
END IF;
END IF;
v_sdate := v_sdate+1;
END LOOP;
END IF;

END IF; dbms_lob.append(v_sql,'SELECT * FROM( SELECT *
FROM '||V_TABLE||' t
WHERE
t.'||V_TABLE_TYPE||' = '''||V_TYPE||'''
AND t.'||V_TABLE_DATE||' >= '''||V_START_DATE||'''
AND t.'||V_TABLE_DATE||' <= '''||V_END_DATE||'''
'||V_SQLWHERE||'
'||V_SQLWHERE_CHANNEL||' ) t1 pivot(sum(MARKETSHARE)
for '||V_TABLE_DATE||' in('); dbms_lob.append(v_sql,v_SQL_DATES);
dbms_lob.append(v_sql,'))');
dbms_output.put_line(v_sql);
OPEN result FOR v_sql; dbms_lob.freetemporary(v_sql);--释放lob
dbms_lob.freetemporary(v_SQL_DATES);--释放lob
--dbms_output.put_line(V_SQLDATE); -- dbms_output.put_line(v_SQL_DATES); --记录操作日志及错误日志
END;

注意:CLOB 类型判断null或空:dbms_lob.getlength(数据库字段) <=0

转自:https://www.cnblogs.com/xwb583312435/p/9052323.htmlhttps://www.cnblogs.com/happinessqi/p/3349661.html

Oracle LOB类型的更多相关文章

  1. LOB类型的学习、总结

    LOB相关的概念 LOB类型: 将信息文件(十进制.二进制).图像甚至音频信息采用数据库作为保存载体时,就需要使用lob类型数据. 有两种Lob,Internal Lob和External Lob.I ...

  2. oracle字段类型

    oracle 字段类型CHAR    固定长度字符串    最大长度2000    bytes              VARCHAR2    可变长度的字符串    最大长度4000    byt ...

  3. Oracle LOB

    Oracle LOB Oracle .NET Framework 数据提供程序包括 OracleLob 类,该类用于使用 Oracle LOB 数据类型. OracleLob 可能是下列 Oracle ...

  4. oracle 字段类型详解

    CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749 NCHAR 根据字符集而定的固定长度字符串 最大长度 ...

  5. db2和oracle字段类型对比

    在网上找到一片关于oracle与DB2数据类型的比较,特记下来. Oracle DB2/400 Oracle数据类型 注意事项 DB2 UDB数据类型 注意事项 DATE DATETIMETIMEST ...

  6. oracle之 Oracle LOB 详解

    一.  官方说明 Oracle 11gR2 文档: LOB Storage http://download.oracle.com/docs/cd/E11882_01/appdev.112/e18294 ...

  7. Oracle数据库类型总结

    RACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID & ...

  8. [Oracle] Lob介绍

    [Oracle] Lob介绍   像Oracle这种关系型数据库,比较擅长处理结构化的数据,那么对于非结构化的数据,Oracle是怎么处理和存储的呢?Lob (Large Object)是Oracle ...

  9. Oracle LOB 大对象处理

    LOB类型列主要是用来存储大量数据的数据库字段,最大可以存储4G字节的非结构化数据. 一.LOB数据类型分类 1.按存储数据的类型分: ①字符类型:   CLOB:存储大量 单字节 字符数据.   N ...

随机推荐

  1. docker 简单总结

    一.docker 安装 yum 方式在centos和rhce上的安装条件: 要安装Docker引擎,你需要一个维护版本的CentOS 7或8.不支持或测试存档版本.必须启用centos-extras存 ...

  2. 利用pyplot绘制sin(x)和cos(x)的组合图像

    一.实验目标 (1)   掌握numpy库的使用 (2)   掌握matplotlib库的使用 (3)   掌握pyplot的基本函数和方法 二.实验内容 import matplotlib.pyla ...

  3. centos 7 安装nfs 实现主机目录共享

    多台服务器之间共享目录,实现每个服务器进入目录看到的内容都一样 服务器A 服务器B 1.服务器A和服务器B,安装 nfs-utils和rpcbind #yum install -y nfs-utils ...

  4. RocketMQ源码详解 | Broker篇 · 其三:CommitLog、索引、消费队列

    概述 上一章中,已经介绍了 Broker 的文件系统的各个层次与部分细节,本章将继续了解在逻辑存储层的三个文件 CommitLog.IndexFile.ConsumerQueue 的一些细节.文章最后 ...

  5. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  6. 2016-12-01,我的CSDN有排名啦!

    等了好久终于等到今天,梦了好久终于把梦实现----[捂脸] 从2015-08-03发表第一篇博客以来,这里就成了我记录技术成长点滴,学习过程,总结备忘的地方,虽然中间自己也在腾讯云上搭过自己的博客,但 ...

  7. Spring Cloud Gateway实战之二:更多路由配置方式

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. elasticsearch7.x配置文件

    前言: 以下配置文件基于elasticsearch-7.13.4版本,当然也适用于其它7.x版本 集群环境: 部署3个节点的集群,各个节点不做角色区分,既是master,也是data,在性能 上这种方 ...

  9. vue配置请求拦截器和响应拦截器

    首先确保我们已经设置的store.js进行值的存取,这时候我们需要配置请求和响应的拦截器设置 main.js import Vue from 'vue' import App from './App' ...

  10. [后端及服务器][WSL2(Ubuntu)+Docker]从零开始在WSL中安装Docker

    目录 简介 WSL 安装 开启虚拟化(BIOS) 检查系统版本 安装WSL 老版本安装详情 简介 想花三篇文章写下从Windows(WSL)上开启Docker部署php/node/vue/html等项 ...