视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle创建序列的方法及技巧
2025-09-25 02:53:29 责编:小OO
文档
Oracle创建序列的方法及技巧

日期:2008-06-23]   来源:互联网整理 

前面说过,关系数据库的一个最重要的方面是,每个表必须有一个主键。许多情况下,在数据库中创建一个作为标识符的新键列是最容易的。例如,Agents表有一个作为主键的AgentID列。但是,总是存在一个问题:从何处取得保证唯一的新编号?在一个较大的组织机构中,可能有一个人力资源部,可以建立某种处理,以便新雇员总能分配一个唯一的编号,并且在雇用某人时该数据被录入到表中。但必须有人密切关注所分配的所有编号,并且还需要检验它们唯一性的一个表单。

相对于依赖基于人工的处理,让数据库生成用作键值的编号更有意义。oracle为此目的使用序列。序列(sequence)是Oracle在需要时用来产生新值的一个编号集合。序列的两个关键点是:必须预先建立;需要代码请求生成新值。序列的编号不是在录入新行时自动生成的。你必须编写代码来生成值,并把它们存储在合适的列中。注意,可以对要自动生成编号的表的Insert事件编写一个数据库触发器。但是,Oracle中最常见的方法是在需要时生成关键值,通常是在表单上生成。

一般,在定义原始表时定义一个序列。但是,因为序列与表之间不存在直接的关系,所以可以在创建编号前建立序列。序列只需创建一次,在整个SQL*Plus中都可以使用。

(1) 因为表中已经存在数据,找出其最大值:

SELECT Max(AgentID) FROM Agents;

(2) 最大值应该为15521,你可能想从一个比它大的值开始。用15522就可以了,但为保险起见,从20000开始:

CREATE SEQUENCE seq_Agents

INCREMENT BY 1

START WITH 20000;

(3) 也是用SQL检索新值,它自动用序列定义中指定的值给计数器增量。试一下,以保证理解相应的命令:

SELECT seq_Agents.NEXTVAL FROM dual;

此命令使用了人为的dual表,因为PL/SQL总是要求使用FROM子句。它应该返回值20000。如果重复此命令,它将返回20001、20002,如此等等。注意,序列简单地返回数字,不对这些数字做任何事情。由你决定使用这些数字作为新主键值。实际上,你可以将这些数字用于任何用途,但应该将一个序列仅用于一个用途。而且,还应该仔细地命名序列,以便别人能够理解其用途。

在创建序列之后,需要给表单添加代码,以便在添加一个新代理时自动生成一个新值。启动Forms Builder并打开Agents表单。应该打开第8章中创建的表单版本,复制第8章中建立的Agents.fmb和Agents.fmx文件,把它们放置到本章的文件夹中。如果没有第8章中创建的版本,可使用本章创建的简单版本。

第1步照常是确定使用何种触发器事件。初看起来,使用On-Insert触发器很吸引人,但该事件在处理过程中有点迟缓。记住,在用户使用表单时,他们单击Insert Record选项创建一个空白页。这个活动触发When-Create-Record事件。On-Insert事件在用户单击Save按钮后才触发。

(1) 对表单的When-Create-Record事件创建一个新触发器。

(2) 使用主菜单上的File/Connect并登录数据库。

(3) 添加代码为Agents生成一个新序列编码:

SELECT seq_Agents.NEXTVAL INTO :AGENTS.AGENTID FROM dual;

(4) 单击Compile按钮,以保证没有输入错误或语法错误。

提示     如果你接收到一条有关dual表的错误消息,很可能是因为没有连接到数据库。

(5) 启动表单以保证生成一个新ID。

图9-15示出打开时的Agents表单。When-Create-Record事件在表单第1次打开时触发。因此,每当用户运行此表单,都将生成一个新的ID值。如果用户不打算输入新代理,单击Execute Query按钮将对已有代理装载表单。所生成的ID值将被抛弃。因为数据库可生成十亿以上的编号,丢掉几个不会产生问题。但是,如果你有一个预期用户很少增加新条目的表单,可以改进此表单的效率。添加Execute_Query语句到When-New-Form-Instance触发器。此动作对用户隐藏初始的空白表单,但仍然会产生额外的序列值。

oracle数据库PL/SQL序列(组图)

资料引用:http://www.knowsky.com/386105.html

序列是Oracle 9i提供的用于按照设定的规则自动产生数据的方案对象。在某些数据表的结构中,有些字段需要这种特性。比如,对于某个学生数据表的学号要害字段,用户可以希望在录入数据时,能够自动在上一个记录的学号字段上自动加1等。由于Oracle 9i提供的16种基本数据类型并没有这样的功能,可以通过序列方案对象来实现。

  

  序列的创建

  

  下面介绍在【企业治理器】中如何创建序列。

  (1)在【企业治理器】中选择【myoracle.mynet】/【方案】/【序列】选项,单击鼠标右键,在出现的快捷菜单里选择【创建】选项,如图9.48所示。

  

  

  (2)出现如图9.49所示的创建序列的【一般信息】选项卡。

  

  在【名称】文本框里输入待定义的序列的名称“TEMPSEQUENCE”。

  

  在【方案】下拉列表框里选择序列所属的用户名“SCOTT”。

  

  序列【类型】参数有两个选项。若选择【升序】单选钮,则表示将创建从初始值向最大值递增的序列,这是创建序列时的默认设置;若选择【降序】单选钮,则表示将创建从初始值向最小值递减的序列。

  

  对【值】可以进行设置的参数如下。

  

  在【最小值】文本框里设置序列答应的最小值。创建序列时该字段最初为空。假如单击【创建】按钮时该字段为空,则对升序序列使用默认值 1,而对降序序列使用默认值 -1026。

  

  在【最大值】文本框里设置序列答应的最大值。创建序列时该字段最初为空。假如单击【创建】按钮后该字段为空,则将对升序序列使用默认值 1027,而对降序序列使用默认值-1。

  

  在【时间间隔】文本框里设置递增序列递增的间隔数值(升序序列)或递减序列递减的间隔数值(降序序列)。创建序列时该字段最初为空,假如单击【创建】按钮后该字段为空,将使用默认值1,该字段只能为正整数。

  

  在【初始值】文本框里设置序列的起始值。假如单击【创建】按钮后该字段为空,对升序序列将使用该序列默认的最小值,对降序序列将使用该序列默认的最大值。

  

  对【选项】可以设置的参数如下。

  

  若选择【循环值】复选框,则表示指定在达到序列最小值或最大值之后,序列应继续生成值。对升序序列来说,在达到最大值后将生成最小值。对降序序列来说,在达到最小值后将生成最大值。假如未选择该复选框,序列将在达到最小值或最大值后停止生成任何值。默认情况下是未选择状态。

  

  若选择【排序值】复选框,则指定序列号要按请求次序生成,默认情况下是未选择状态。

  

  在【高速缓存】中设置由数据库预分配并存储的值的数目参数。若选择【默认值】单选钮,则表示将设置默认值为 20,默认情况下选择此选项;若选择【无高速缓存】单选钮,则表示指定不预分配序列值;若选择【大小】单选钮,则表示在文本框里输入可接受的值,最小值为2,对循环序列来说,该值必须小于循环中值的个数。假如序列能够生成的值数的上限小于高速缓存大小,则高速缓存大小将自动改换为该上限数。

  

  完成设置后单击【创建】按钮。

  

  (3)成功创建序列后,出现如图9.50所示界面。单击“确定”按钮。

  

 

  (3)读者也可以在【SQLPlus Worksheet】中执行下列SQL程序创建序列。

  ―――――――――――――――――――――――――――――――――――――

  CREATE SEQUENCE "SCOTT"."TEMPSEQUENCE"

  INCREMENT BY 1 START WITH 1

  MAXVALUE 1.0E28 MINVALUE 1

  NOCYCLE CACHE 20 NOORDER

  ―――――――――――――――――――――――――――――――――――――

  【配套程序位置】:第9章\\ createsequence.sql。

  

  序列的使用

  

  下面介绍在向数据表中插入数据时如何使用序列。

  

  (1)首先为实例建立一个数据表“SCOTT.SEQUENCE_TABLE”,为简化起见,该数据表仅包含一个类型为“NUMBER”的数据列“NO”。

  

  在如图9.51所示的创建表的【一般信息】选项卡中进行如下设置。

  

  在【名称】文本框中输入“SEQUENCE_TABLE”。

  

  在【方案】下拉列表框中选择“SCOTT”。

  

  在【表空间】下拉列表框中选择“USERS”。

  

  在【名称】单元格中输入“NO”,在【数据类型】下拉列表框单元格中选择“NUMBER”。

  

  完成设置后单击【创建】按钮。

  

 

  (2)读者也可以在【SQLPlus Worksheet】中执行下列SQL代码创建数据表“SCOTT.SEQUENCE_TABLE”。

  ―――――――――――――――――――――――――――――――――――――

  CREATE TABLE "SCOTT"."SEQUENCE_TABLE" ("NO" NUMBER(10) NOT NULL)

  TABLESPACE "USERS"

  ―――――――――――――――――――――――――――――――――――――

  【配套程序位置】:第9章\\ createsequencetable.sql。

  

  (3)在插入新的记录时,使用刚创建的“TEMPSEQUENCE”序列来自动产生“NO”数据列的值。在【SQLPlus Worksheet】里执行下面的SQL代码,执行的结果如图9.52所示。

  ―――――――――――――――――――――――――――――――――――――

  INSERT INTO SCOTT.SEQUENCE_TABLE(NO)

  VALUES(SCOTT.TEMPSEQUENCE.NEXTVAL);

  ―――――――――――――――――――――――――――――――――――――

  【配套程序位置】:第9章\\ insertsequencetable.sql。

  

  “SCOTT.TEMPSEQUENCE.NEXTVAL”表分配下一个惟一的、可用的序列号。

  执行“SCOTT.TEMPSEQUENCE.NEXTVAL”后,可以使用“SCOTT.TEMPSEQUENCE. CURRVAL”来标识上一个已经存储的序列值。

  (4)在【SQLPlus Worksheet】中可以执行查询数据表“SCOTT.SEQUENCE_TABLE”数据的语句。执行结果如图9.53所示,表明序列“SCOTT.SEQUENCE”产生的值已经成功录入数据表中。

  ―――――――――――――――――――――――――――――――――――――

  select * from scott.sequence_table;

  ―――――――――――――――――――――――――――――――――――――

  【配套程序位置】:第9章\\ selectsequencetable.sql。

  

  

点击查看大图

  序列的删除

  

  下面介绍在【企业治理器】中如何删除序列。

  

  (1)在创建好的序列“SEQUENCE1”上用单击鼠标右键,在出现的快捷菜单里选择【移去】选项,如图9.54所示。

  

 

  (2)出现如图9.55所示的【删除序列确认】界面,单击【是】按钮。

  

资料引用:http://www.knowsky.com/386105.html下载本文

显示全文
专题