用Oracle的解析函数发现序列间隙

数据库表格中经常用到值序列。无论是作为数据本身自然产生的,还是由Oracle 的序列对象分配的,它的目的就是用一个唯一的、递增的数字给每一行编号。

在编号的过程中,产生间隙的原因多种多样。如果一个存储过程从一个序列中挑选某个数字,定为本地变量,但是从来不用它,这个数字就丢失了。它将不能再返回到原序列中,结果就造成数值序列中存在一个间隙。关系型数据库模型中不必担心这一点。但是有时候人们在意这一点,这些人想知道是哪些数字丢失了。

一个显而易见的方式就是用PL/SQL:在已排序指针中循环,并且用一个本地变量进行存储,把每一个数值与其前一行的进行比较。这种方法的问题在于效率很低,速度很慢。另外一个不常用的解决办法就是对表格做一个自合并,实质也就是用某种标准使每一行与其前一行相匹配。这种方法很难编写代码。

Oracle的解析函数为检查间隙提供了一种要快捷得多的方法。它们使你在使用完整的、面向集合的SQL处理的同时,仍然能够看到下一个行(LEAD)或者前一行(LAG)的数值。

下面是这些函数的格式:

{LEAD | LAG} (value_expression, offset, default)

OVER ([PARTITION BY expr] ORDER BY expr)

通常,value_expression是一个你想要检索的数据列。参数offset是指你想要往前或往后读取的行数,default则是到达任意一个分区的开头或者结尾(即没有与之相匹配的行)时返回的数值。

列表A中的脚本是一系列从工作地传感器自动收集来的数据。传感器装置自动给每一个测量值编上号,我们要找出结果有没有缺失。

在列表B中,我们将数据按照测量值编号排序,运用LAG函数,把偏移量设置为1,使得每一行与其前一行对应起来。第一行将没有对应量,所以相应地,将返回默认值0。因为间隙不可能发生在第一行,所以我们通过之前要求测量值大于0而将其删除。

剩下的就是一组虚拟的行,显示的是前一行的测量值编号(“before_gap”)和当前行的测量值编号(“after_gap”)。如果两者之差大于1,就说明这两行之间存在间隙。

同时也要注意到,WITH子句在查询开始的时候把解析子查询命名为“aquery”。那么我们就可以在主SELECT 语句中的WHERE 子句中访问“aquery”中的数列。

时间: 2024-09-11 09:18:01

用Oracle的解析函数发现序列间隙的相关文章

用Oracle解析函数快速检查序列间隙

数据库表格中经常用到值序列.无论是作为数据本身自然产生的,还是由Oracle 的序列对象分配的,它的目的就是用一个唯一的.递增的数字给每一行编号. 在编号的过程中,产生间隙的原因多种多样.如果一个存储过程从一个序列中挑选某个数字,定为本地变量,但是从来不用它,这个数字就丢失了.它将不能再返回到原序列中,结果就造成数值序列中存在一个间隙.关系型数据库模型中不必担心这一点.但是有时候人们在意这一点,这些人想知道是哪些数字丢失了. 一个显而易见的方式就是用PL/SQL,在已排序指针中循环,并且用一个本

oracle 字符串拆分,序列,插入数据

问题描述 oracle 字符串拆分,序列,插入数据 insert into stud_sname1_417 (id,sname1) select seq_sname1_417,distinct substr(name,1,1) from name; 请问为什么是 missing expression 解决方案 Oracle拆分字符串函数Oracle拆分字符串函数Oracle拆分字符串函数 解决方案二: insert into stud_sname1_417 (id,sname1) SELECT

oracle数据库开发中序列的使用

序列的概念: 序列是一数据库对象,利用它可生成唯一的整数. 一般使用序列自动地生成主码值.一个序列的值是由特殊的Oracle程序自动生成,因此序列避免了在应用层实现序列而引起的性能瓶颈. Oracle序列允许同时生成多个序列号,而每一个序列号是唯一的.当一个序列号生成时,序列是递增,独立于事务的提交或回滚.允许 设计缺省序列,不需指定任何子句.该序列为上升序列,由1开始,增量为1,没有上限. 1: 建立序列命令 CREATE SEQUENCE [user.]sequence_name [incr

Oracle中 sequences(序列)介绍

Oracle提供了sequence对象,由系统提供自增长的序列号,用于生成数据库数据记录的自增长主键或序号的地方.如果当前的序列不存在,它会创建一个序列,如果存在,它首先要得到当前序列的最大值,然后再加一,实现自增长的功能. 建立序列命令 CREATE SEQUENCE [user.]sequence_name [increment by n] [start with n] [maxvalue n | nomaxvalue] [minvalue n | nominvalue]; [NOCYCLE

当你安装完Oracle数据库后,发现自己忘记密码了?!

1)进入cmd 2)sqlplus           conn / as sysdba(直接登录sql plus从这步开始) 3)alter user要修改密码的用户名 identified by 新密码;

oracle 序列

序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.创建序列需要CREATE SEQUENCE系统权限.序列的创建语法如下:Sql代码 CREATE SEQUENCE 序列名    [INCREMENT BY n]    [START WITH n]    [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]    [{CYC

sql-Hibernate+Oracle 提示序列不存在

问题描述 Hibernate+Oracle 提示序列不存在 这是错误信息 Hibernate: select hibernate_sequence.nextval from dual 一月 12, 2016 10:28:02 上午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 2289, SQLState: 42000 一月 12, 2016 10:28:02 上午 org.hibe

【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理

篇三:批量处理后的txt文件入库处理 [开篇概述]:本文继上述文章再做深度剖析,本篇主要介绍txt入库(oracle)和wpf分页,在此篇涉及的页面设计前篇已经细述不再概说.里面涉及到oracle 64位系统安装处理问题,以前oracle的表,序列,触发器,自增种子等基本操作.外加文件操作和利用用户控件分页等技术.大致效果图如下,其次粘贴完整代码,其后就一一概说本文核心要点和难点突破,最后梳理技术知识点,使其一则保持完整性,二则梳理整理知识点便于随时取用.(本篇暂做效果图如下,至于最终效果图和审

理解ORACLE 字符集【转】

一.引言     ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,ORACLE为用户提供自己熟悉的数据 库母语环境,诸如日期格式.数字格式和存储序列等.Oracle可以支持多种语言及字符集,其中oracle8i支持48种语言.76个国家地域.229 种字符集,而oracle9i则支持57种语言.88个国家地域.235种字符集.由于oracle字符集种类多,且