首页 > 数据库 >Oracle的clob数据类型

Oracle的clob数据类型

时间:2022-09-23 10:14:42浏览次数:81  
标签:index dbms firstname clob lastname age 数据类型 start Oracle

字符串长度

语法:DBMS_LOB.GETLENGTH(field)

作用:获取filed字段的总长度,和length函数类似

字符串截取

场景:使用substr函数有时会无法解决clob数据类型的数据,我们可以使用DBMS_LOB.substr函数,作用和substr函数类似。

语法:

-- 从start位置在field截取长度为length的字符串
DBMS_LOB.SUBSTR(field,length,start)

-- 获取field的所有数据
DBMS_LOB.SUBSTR(field)

注意:如果filed的字段很长的话还是会出现"字符串截断"的情况,但是可以根据数据的实际情况调整length的长度,效果会比substr函数好点

查询字符串索引位置

语法:

-- 查询field中keyword从startPosition开始第number次出现的索引
dbms_lob.instr(field,keyword,startPosition,number)

-- 查询field中keyword从startPosition开始出现的索引
dbms_lob.instr(field,keyword,startPosition)

-- 从左往右查询field中符合keyword的索引。
dbms_lob.instr(field,keyword)

作用:和instr类似,不过dbms_lob.instr可以解决大数据字段的问题

注意:

  • 如果field中没有找到keyword,则返回值为0
  • 如果startPosition的值为0,则返回值为NULL

案例

clob数据类型的数据提取

有的时候我们会在数据库中使用clob来存储json的数据,后续需要从clob中读取对应的数据项。

提取数据,需要分析对应的数据结构,不同的数据结构处理的形式不同。

假设在user表中的info字段使用的是clob数据类型,其中存储如下数据:

{
  "employees":[
    {"firstName":"Bill","lastName":"Gates","creation_time":"2021-01-01","age":"30"},
    {"firstName":"George","lastName":"Bush","creation_time":"2021-06-01","age":"26"},
    {"firstName":"Thomas","lastName":"Carter","creation_time":"2020-03-01","age":"23"},
    ...
    ]
}

需求:提取出employees中firstName、lastName、age三个数据项信息,并且数据项的信息是混乱的

思路:使用存储过程,不断的遍历获取所需的数据项,一旦没有找到数据则不再执行。

分析:

  1. 删除原有临时表的数据,保证临时表记录的数据是最新的

  2. 使用dbms_instr函数来定位关键字的位置,获取关键字对应键的值

  3. 修改dbms_instr函数下一次关键字的起始位置,因为数据量的个数不确定

  4. 使用while来进行死循环,然后当关键字没找到,直接退出死循环,遍历下一行

以下代码在达梦数据库下验证通过

①创建测试数据

create table test001 (
  info clob
);
insert into test001 values ('
{
  "employees":[
    {"firstName":"Bill","lastName":"Gates","creation_time":"2021-01-01","age":"30"},
    {"firstName":"George","lastName":"Bush","creation_time":"2021-06-01","age":"26"},
    {"firstName":"Thomas","lastName":"Carter","creation_time":"2020-03-01","age":"23"}
    ]
}           
')

②创建临时表存储数据

create table t_employees (
    firstname varchar2(20),
  lastname varchar2(20),
  age number
)

③创建存储过程

create or replace procedure p_employees() is 
declare
  cursor datas is select info from test001;

-- 定义关键字的位置来获取关键字的信息
firstname_index number;
firstname_start_index number;
firstname_end_index number;
firstname_value varchar2(100);

lastname_index number;
lastname_start_index number;
lastname_end_index number;
lastname_value varchar2(100);

age_index number;
age_start_index number;
age_end_index number;
age_value varchar2(100);

v_sql varchar2(1000);

begin
  -- 删除原有的数据,保证临时表存储新的数据
    v_sql:= 'delete from t_employees';
    execute immediate v_sql;
    -- 遍历游标,即遍历每行
    for data in datas loop
        
        firstname_start_index:= 1;
        lastname_start_index:= 1;
        age_start_index:= 1;

        while 1>0 loop
            -- 根据关键字定位位置,然后获取 firstName": "XXX" 中XX的值
            firstname_index:= dbms_lob.instr(data.info,'firstName',firstname_start_index);

            if firstname_index=0 then 
                goto next1;
            end if;

            firstname_start_index:= firstname_index+length('firstName":"');
            firstname_end_index:= dbms_lob.instr(data.info,'"',firstname_start_index);
            firstname_value:= dbms_lob.substr(data.info,firstname_end_index-firstname_start_index,firstname_start_index);

            lastname_index:= dbms_lob.instr(data.info,'lastName',lastname_start_index);
            lastname_start_index:= lastname_index+length('lastName":"');
            lastname_end_index:= dbms_lob.instr(data.info,'"',lastname_start_index);
            lastname_value:= dbms_lob.substr(data.info,lastname_end_index-lastname_start_index,lastname_start_index);

            age_index:= dbms_lob.instr(data.info,'age',age_start_index);
            age_start_index:= age_index+length('age":"');
            age_end_index:= dbms_lob.instr(data.info,'"',age_start_index);
            age_value:= dbms_lob.substr(data.info,age_end_index-age_start_index,age_start_index);

            v_sql:= 'insert into t_employees values ('''||firstname_value||''','''||lastname_value||''','||age_value||')';
            execute immediate v_sql;
        end loop;

        <<next1>>
        null;

    end loop;
end;

④调用存储过程

call p_employees()

⑤查询结果

参考资料

标签:index,dbms,firstname,clob,lastname,age,数据类型,start,Oracle
From: https://www.cnblogs.com/wpcnblog/p/16721707.html

相关文章

  • oracle 创建表空间
    oracle创建表空间oracle创建表空间可能很多人并不是很了解,下面就来简单介绍一下,主要是分为四步的,每一步的代码一定要认真研究,这样才能保证正确创建。 ......
  • JS数据类型 之 Symbol详解
    1、Symbol概述ES6引入的一种新的原始数据类型Symbol,表示独一无二的值。它属于JavaScript语言的原生数据类型之一,其他数据类型是:undefined、null、Boolean、String、Numb......
  • Oracle索引并行度
    一.Rebuild索引与并行度说明在索引create和rebuild的时候,在CPU允许的情况下,我们可以使用parallel来加快操作的速度。但是这里有一个注意的问题,有关索引的并行度,这个对表......
  • Oracle DBCA 静默删除以及建库的脚本
    No.1背景公司最近有一个测试环境需要重新备份恢复但是里面有6个数据库实例400多G的数据文件.一般情况下需要dropuserxxxcascade;然后执行droptablespacexxx......
  • Oracle循环设置表权限
      beginforiin(select'grantselecton'||table_name||'toimes'asstmfromuser_tableswheretable_namenotlike'%$%' )loop......
  • Oracle启动监听报错:The listener supports no services解决
    前几天一台项目开发使用的Oracle11g服务器重启系统之后,出现了几个莫名的报错,下面是其中一个,已解决。$lsnrctlstart报错提示:ThelistenersupportsnoservicesTheco......
  • ORACLE11gR2完全卸载
     1. 停止“服务”中所有的ORCLE服务。进入服务的方法很多,如:(1)在运行中输入services.msc,然后找到所有跟oracle 有关的服务。(2)开始->设置->控制面板->管理工具->服......
  • 通过异或(^)实现基本数据类型(浮点型除外)值互换
    一般情况下,我们要实现值替换的时候需要引入一个中间变量,以int为例代码如下inta=10,b=20;//中间变量inttemp;temp=a;a=b;b=temp;//a=20,b=10......
  • Typescript学习之路(3) - 基础数据类型介绍
    安装TSnpmi-gtypescriptTips:因为使用的命令是tsc,这里安装的时候好多人都错误写成了 npmi-gtsc❎,结果在使用的时候就会被提示,安装的不对,要重新安装。TS转换JS......
  • Go语言基础之基本数据类型
    基本数据类型    Go语言中有丰富的数据类型,除了基本的整型、浮点型、布尔型、字符串外,还有数组、切片、结构体、函数、map、通道(channel)等。Go语言的基本类型和其他......