自定义SQUENCE.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自定义SQUENCE

自定义SEQUENCE 理解PLSQL与SQL工作引擎切换原理,有助于编程人员写出更有效的应用。 这里给出一个例子,自定义更灵活的SEQUERCE. [事例] 多个流水号的生成 问题的提出,如果一个表含有多个月份的数据的订单,订单号采用月份+自然数 如2011年12个月 1月份的订单号为: 201101_0001 201101_0002 2月份的订单号为: 201102_0001 201102_0002 以此类推 如果2月份最新订单号 为 201102_0009 则新增加的一个订单号为201102_0010 在数据库中如何实现呢?问题的本质是如何在数据库中设定一个全局变量,像sequence的那样变量? SEQUENCE的本质: SEQUENCE主要应用于插入数据的时候,生成一个连续的序列号。 虽然沃恩在过程中不能写 select seq1.nextval() --into p from dual 而是直接使用seq1.nextval(),没有出现select或其他SQL词汇,但是其背后还是一个查询。 一个SEQUENCE在关闭数据库后重新启动后,SEQUENCE并没有回到设定状态来看,SEQUENCE的最新值一定是写在磁盘上了。 那么每一次调用SEQUENCE,可以设想期间一定伴随着读写的操作。可以推断,与无SQL引擎操作的函数相比,效率一定低了不少。 其次,SEQUENCE是全局性的连续自然数,针对多个流水号这样的应用,其不是要设定很多SEQUENCE吗? 在这里,我们采用ORACLE数据库的全局上下文,设计一种更加灵活的SQUENCE,代替ORACLE的SEQUENCE。 题外话 rollback 并不能回滚 SEQUENCE create sequence SEQ1 minvalue 0 maxvalue 9999999999999999999999999999 start with 30004 increment by 1 nocache; create table test_seq( id int ) begin dbms_output.put_line(seq1.currval); insert into test_seq values (seq1.nextval); dbms_output.put_line(seq1.currval); rollback; dbms_output.put_line(seq1.currval); end; 输出 30002 30003 30003 输出结果表明,回滚并不能使SEQUENCE也发生回滚,回到调用前的状态。 题外话结束 建立一个全局性的上下文 myctx create or replace context myctx using mypkg accessed globally 建立包头 create or replace package mypkg is procedure set_ctx(p_name in varchar2, p_value in integer); 不需要初始化 --procedure init; end mypkg; 建立包体 create or replace package body mypkg is procedure set_ctx(p_name in varchar2, p_value in integer) as begin --myctx 是全局上下文名称 --与建立上下文中的myctx一致 dbms_session.set_context(myctx, p_name, p_value, NULL, NULL); end; begin null; end mypkg; 在session1中 begin mypkg.set_ctx(var1, 1234); mypkg.set_ctx(var2, 2234); end; select sys_context( myctx, var1 ) var1, sys_context( myctx, var2 ) var2 from dual 建立session2 select sys_context( myctx, var1 ) var1, sys_context( myctx, var2 ) var2 from dual 不同session与不同用户下 select sys_context( myctx, var1 ) var1, sys_context( myctx, var2 ) var2 from dual 都能得到相同的结果,说明这是一个全局性的变量。 有

文档评论(0)

80092355km + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档