VARCHAR2分为PL/SQL数据类型中的变量类型和Oracle数据库中的字段类型,不同场景的最大长度不同。接下来通过这篇文章,我给大家分享一下Oracle的CLOB大数据字段类型的操作方法。有兴趣的朋友来看看吧。
一、Oracle中的varchar2类型
通常,我们使用VARCHAR2在Oracle数据库中存储字符数据。VARCHAR2分为PL/SQL数据类型中的变量类型和Oracle数据库中的字段类型,不同场景的最大长度不同。
在Oracle数据库中,VARCHAR2字段类型,最大值为4000;PL/SQL中的VARCHAR2变量类型,最大字节长度为32767。
当VARCHAR2装不下我们需要存储的信息时,Oracle的大数据类型LOB(大型对象)就出来了。
二、Oarcle中的LOB类型
在Oracle中,LOB(大型对象)类型字段现在使用得越来越多。因为这种类型的字段容量很大(最多可以容纳4GB的数据),而且一个表中可以有多个这种类型的字段,所以非常灵活,适用于数据量非常大的业务领域(比如图像、档案等)。).
LOB有两种类型:BLOB和CLOB: BLOB是二进制大对象,适用于存储非文本字节流数据(如程序、图像、音视频等。).
CLOB,即字符大对象,与字符集相关,适合存储文本数据(如历史档案、巨著等。).
三、DB中使用CLOB类型字段
(一),创建一个表(使用sql或直接在PL/SQL客户端中),字段类型CLOB
-创建表格
创建临时表
(
名称VARCHAR2(200),
年龄号,
临时_封闭封闭
)
表空间INSIGHTDATA3_TS
pctfree 10
initrans 1
maxtrans 255
储存;储备
(
初始160K
下一个1M
minextents 1
maxextents无限制
);
(2)添加、删除和检查
让我们看看如何以正常方式操作CLOB类型:
SELECT t.name,t.temp _ clob FROM temp t-普通查询insert into temp t values(' grand . Jon ',22,'加入博客园的第一天');
由于查询不是varchar2类型,普通查询看不到CLOB类型的字段内容,结果如下
普通的insert操作也会因为Oracle的隐式转换,默认将字符串转换为varchar2类型。一旦字符串的内容超过varchar2的最大值,就会报告ora-01704(字符串太长)错误。
正确操作
-使用PL/SQL语法,通过绑定变量而不是直接拼接SQL来求解
声明
V_LANG CLOB :='要插入的海量字符串';
V_UPDATE CLOB :='更新的海量字符串';
开始
插入温度测试值(' Grand。乔恩',22,V _ LANG);-增加
UPDATE temp t SET t . temp _ clob=V _ UPDATE其中rownum=1;-修改
SELECT t.NAME,DBMS _ lob . substr(t . TEMP _ clob)FROM TEMP t;-该查询将CLOB转换为字符类型。
删除其中rownum=1的temp t;-按列删除
提交;
结束;
/
我们在CLOB的操作中基本上使用了dbms_lob中的substr、append、write等方法。
dbms_lob 方法总结
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 . free temporary(v _ SQL);-释放clob
查询结果如下:
四、在存储过程中使用CLOB类型实例
需求:以开发的存储过程为例。有必要遍历时间范围来拼接sql,并按列透视时间和日期。如果时间太长(超过1年),sql语句(varchar2)将报告一个超出范围的错误。这时候就需要使用CLOB来存储拼接后的sql。
过程P _ AND _ CPT _ RATIOOTH _ APP _ BAK2 _ N(
VARCHAR2中的V_APPIDS,
VARCHAR2中的V_TYPE,
VARCHAR2中的V_CHANNEL,
VARCHAR2中的V_TABLE,
VARCHAR2中的V_START,
VARCHAR2中的V_END,
结果输出mycursor
)是
V _ SQL CLOB
v _ SQL where varchar 2(32767)default“”;
v _ SQL where _ CHANNEL varchar 2(32767)默认“”;
V _ SQL _ DATES CLOB
V_Sdate日期;
日期;
v _ TABLE _ DATE varchar 2(50);
v _ TABLE _ TYPE varchar 2(50);
v _ START _ DATE varchar 2(50);
v _ END _ DATE varchar 2(50);
v _ DAY varchar 2(50);
开始
从用户选项卡列中选择列名到V表日期其中table_name=''||V_TABLE|| ' ',column _ id=1。
从user _ tab _ columns中选择column _ name到V _ TABLE _ TYPE其中table_name=''||V_TABLE|| ' ',column _ id=5;
dbms_lob.createtemporary(V_SQL,true);-创建一个临时高球
DBMS _ lob。创建临时(V _ SQL _ DATES,true);-创建一个临时高球
如果V_APPIDS不为空,则
||V_APPIDS|| ')'中的V_SQLWHERE :='和t . appid
结束如果;
如果垂直频道不为空,则
V_SQLWHERE_CHANNEL :='和t.channel=' ' ' | | V _ CHANNEL | |
结束如果;
如果V_TABLE_DATE='MON ',则
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)循环
dbms_lob.append(v_SQL_DATES,to_char(v_sdate,' yyyymm ');-把临时字符串付给虚拟字符串
如果v_sdate!=v_edate然后
dbms_lob.append(v_SQL_DATES,',');-把临时字符串付给虚拟字符串
结束如果;
v_sdate :=add_months(v_sdate,1);
结束循环;
否则-周和日类型都是天
v_sdate :=to_date(V_START,' yyyymmdd ');
v_edate :=to_date(V_END,' yyyymmdd ');
V _ END _ DATE:=V _ END;
如果SUBSTR(V_TYPE,0,1)='d '则
V_START_DATE :=to_char(v_sdate,' yyyymmdd ');
WHILE (v_sdate=v_edate)循环
dbms_lob.append(v_SQL_DATES,to_char(v_sdate,' yyyymmdd '));-把临时字符串付给虚拟字符串
如果v_sdate!=v_edate然后
dbms_lob.append(v_SQL_DATES,',');-把临时字符串付给虚拟字符串
结束如果;
v _ sdate:=v _ sdate 1;
结束循环;
ELSIF SUBSTR(V_TYPE,0,1)='w' THEN
select to_char(V_Sdate,' d ')INTO V _ DAY from dual;
如果v _日!那么=2
V _ Sdate:=V _ Sdate-7;
结束如果;
V_START_DATE :=to_char(v_sdate,' yyyymmdd ');
WHILE (v_sdate=v_edate)循环
select to_char(V_Sdate,' d ')INTO V _ DAY from dual;
如果V_DAY=2,则
dbms_lob.append(v_SQL_DATES,to_char(v_sdate,' yyyymmdd '));-把临时字符串付给虚拟字符串
如果V_Edate-v_sdate 7则
dbms_lob.append(v_SQL_DATES,',');-把临时字符串付给虚拟字符串
结束如果;
结束如果;
v _ sdate:=v _ sdate 1;
结束循环;
结束如果;
结束如果;
dbms_lob.append(v_sql,' SELECT * FROM( SELECT *
FROM '||V_TABLE||' t
在哪里
t.| | V _ TABLE _ TYPE | | '=' ' ' | | V _ TYPE | | ' ' '
和t . ' | | V _ TABLE _ DATE | | '=' ' ' | | V _ START _ DATE | | ' ' '
和t . ' | | V _ TABLE _ DATE | | '=' ' ' | | V _ END _ DATE | | ' ' '
||V_SQLWHERE|| '
||V_SQLWHERE_CHANNEL||' ) t1
透视(总和(市场份额)
对于(')中的" | | V _ TABLE _ DATE | | ";
dbms_lob.append(v_sql,v _ SQL _ DATES);
dbms_lob.append(v_sql,')');
DBMS _ outputput _ line(v _ SQL);
打开虚拟sql的结果;
DBMS _ lob。免费临时(v _ SQL);-释放高球
DBMS _ lob。免费临时(v _ SQL _ DATES);-释放高球
-DBMS _ output。put _ line(V _ SQLDATE);
-DBMS _ output。put _ line(v _ SQL _ DATES);
-记录操作日志及错误日志
结束;
五、使用Java开发操作CLOB字段
(一)、原生JDBC处理泥炭田类型
增加,一般会插入一个空的泥炭田到数据库对应的字段,然后锁定该列,用写将待插入字符串写入进去。
重点:这两步操作要放在同一个事务里面。具体增加的方法如下:
公共布尔保存(文章文章){
布尔结果=真;
连接接头=连接单元。getinstance();
字符串sql='插入临时值(?empty _ clob())’;
//锁住该列,防止并发写入时候该字段同时被多次写入造成错误
string sqlClob=' select temp _ clob from temp t where t . name=?用于更新;
PreparedStatement pst=null
结果集rs=空
Writer writer=null
尝试{
conn . set自动提交(false);//设置不自动提交,开启事务
PST=conn . prepare语句(SQL);
pst.setString(1,文章。getname());
pst.setString(2,文章。getage());
太平洋标准时间。执行update();
PST=conn . prepare语句(sqlClob);
pst.setInt(1,文章getid());
RS=PST。执行查询();
CLOB clob=null
if(rs.next()){
尝试{
CLOB=(CLOB)RS。get CLOB(1);
writer=clob。getcharacteroutputstream();//拿到泥炭田的字符输入流
作家。写(文章。get content());
作家。flush();
作家。close();
} catch (IOException e) {
e。printstacktrace();
}
}
conn . commit();
} catch (SQLException e) {
结果=假;
尝试{
conn . roll back();//当犯罪或者反转后会自动释放该列的锁定
} catch (SQLException e1) {
E1。printstacktrace();
}
e。printstacktrace();
}最后{
conn . set自动提交(true);//还原
connectionunitls。关闭(苏格兰、太平洋标准时间、康涅狄格州);
}
返回结果;
}
更新操作,更新时候主要利用准备报表的setClob方法:
公共布尔更新(字符串名称、字符串内容){
int result=0;
连接接头=连接单元。getinstance();
string SQL=' update temp set temp _ clob=?其中name=?';
PreparedStatement pst=null
尝试{
CLOB CLOB=Oracle。SQL。CLOB。创建临时(conn,false,Oracle。SQL。CLOB。持续时间_会话);
clob.setString(1L、内容);
PST=conn . prepare语句(SQL);
pst.setClob(1,clob);
pst.setString(2,name);
结果=PST。执行update();
} catch (SQLException e) {
e。printstacktrace();
}最后{
ConnectionUntils.close(null,pst,conn);
}
如果(结果==0)
返回错误的
返回真实的
}
查询就主要是从结果集结果集中定位到对应的字段后,往外读:
公共文章选择(字符串名称){
文章文章=新文章();
连接接头=连接单元。getinstance();
String sql='select name,age,temp_clog from temp where name=?';
PreparedStatement pst=null
结果集rs=空
尝试{
PST=conn . prepare语句(SQL);
pst.setInt(1,id);
RS=PST。执行查询();
StringBuilder builder=new StringBuilder();
if(rs.next()){
clob clob=RS。get clob(' temp _ clog ');
读者rd=clob。getcharacterstream();
char[]str=new char[12];
while(rd.read(str)!=-1) {
生成器.追加(新字符串(str));
}
文章。设置内容(构建器。tostring());
文章。集合名称(RS。getstring(' name ');
文章。setage(卢比。getint(' age ');
}
} catch (SQLException e) {
e。printstacktrace();
} catch (IOException e) {
e。printstacktrace();
}最后{
connectionunitls。关闭(苏格兰、太平洋标准时间、康涅狄格州);
}
退货商品;
}
(二)、冬眠、Mybatis框架操作
这个因为框架都封装集成好了,所以我们使用的时候直接配置变量的类型为泥炭田就可以。
譬如:Mybatis
结果column=' temp _ Clob ' property=' content ' JDBC类型=' Clob '类型处理程序=' org。阿帕奇。伊巴提斯。类型。clobtypehandler '/
貌似冬眠5内部做了对应的处理,可以直接当线类型一样处理即可。
总结
以上所述是小编给大家介绍的神谕的泥炭田大数据字段类型操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。