• Oracle 自增写给自己的


    首先咱先建一张表:

      

    CREATE TABLE example(

      ID Number(4) NOT NULL PRIMARY KEY,

      NAME VARCHAR(25),

      PHONE VARCHAR(10),

      ADDRESS VARCHAR(50) );

    然后咱再建一个自定义的序列:

      

    CREATE SEQUENCE emp_sequence

      INCREMENT BY 1 -- 每次加几个

      START WITH 1 -- 从1开始计数

      NOMAXVALUE -- 不设置最大值

      NOCYCLE -- 一直累加,不循环

      NOCACHE -- 不建缓冲区

    还需要一个触发器

     CREATE TRIGGER "触发器名称" BEFORE

      INSERT ON example FOR EACH ROW WHEN (new.id is null)

      begin

      select emp_sequence.nextval into: new.id from dual;

      end;

     打完收工!下面你就试试插入数据吧!

      INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei');

      ==================================================================================

      ORACLE SEQUENCE的简单介绍(自增长字段)- -

      在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

      1、Create Sequence

      你首先要有Create Sequence或者Create AnySequence权限,

      Create Sequence emp_sequence

      INCREMENT BY 1    --每次加几个

      STARTWITH 1    --从1开始计数

      NOMAXVALUE    --不设置最大值

      NOCYCLE    --一直累加,不循环

      CACHE10 ;

      一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

      CURRVAL=返回sequence的当前值

      NEXTVAL=增加sequence的值,然后返回sequence值

      比如:

      emp_sequence.CURRVAL

      emp_sequence.NEXTVAL

      可以使用sequence的地方:

      -不包含子查询、snapshot、VIEW的SELECT语句

      -INSERT语句的子查询中

      -INSERT语句的VALUES中

      -UPDATE的SET中

      可以看如下例子:

      INSERT INTO emp VALUES

      (empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);

      SELECT empseq.currval FROM DUAL;

      但是要注意的是:

      第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENTBY值,然后返回增加后的值。CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

      如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。使用cache或许会跳号,比如数据库突然不正常down掉(shutdownabort),cache中的sequence就会丢失.所以可以在createsequence的时候用nocache防止这种情况。

      2、Alter Sequence

      你或者是该sequence的owner,或者有ALTER ANYSEQUENCE权限才能改动sequence.可以alter除start至以外的所有sequence参数.如果想要改变start值,必须drop sequence再re-create.

      Alter sequence的例子

      ALTER SEQUENCE emp_sequence

      INCREMENT BY 10

      MAXVALUE 10000

      CYCLE--到10000后从头开始

      NOCACHE;

      影响Sequence的初始化参数:

      SEQUENCE_CACHE_ENTRIES=设置能同时被cache的sequence数目。

      可以很简单的Drop Sequence

      DRO SEQUENCE order_seq;

      -------------------------------------------------------------

      自增长及触发器:

      如何在Oracle中实现类似自动增加ID的功能?

      我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE中没有这样的功能,我们可以通过采取以下的功能实现自动增加ID的功能

      1.首先创建sequence

      create sequence seq maxincrement by 1

      2.使用方法

      select seqmax.nextval ID from dual

      就得到了一个ID

      如果把这个语句放在触发器中,就可以实现和mssql的自动增加ID相同的功能!

      -------------------------------------------------------------------------

      ###建表###

      CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL,

      "TYPE" NUMBER(3) NOT NULL,

      "BODY" VARCHAR2(100) NOT NULL,

      "HITS" NUMBER(10) DEFAULT 0 NOT NULL,

      PRIMARYKEY("ID"))

      TABLESPACE "TS_SPORTS"

      ###建序列###

      CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1

      START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE

      CACHE 50 NOORDER

      ###建自动更新的触发器###

      CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"

      BEFORE INSERT ON "SPORTS"."LINEUP" FOR EACH ROW

      DECLARE

      next_id NUMBER;

      BEGIN

      --Get the next id number from the sequence

      SELECT sports_lineup_id_seq.NEXTVAL INTO next_id FROM dual;

      --Use the sequence number as the primarykey

      --for there cord being inserted.

      :new.id:=next_id;

      END;

      ###建保护PRIMARYKEY的触发器###

      CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"

      BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" FOR EACHROW

      BEGIN

      RAISE_APPLICATION_ERROR(-20000,

      'sports_lineup_id_update_trigger:Update sof the ID field'

      ||'arenotallowed.');

      END;

      ###建删除的触发器###

      create   or replace trigger tr_bis_exc_req_del

      before delete

      on bis_exc_req

      referencing old as old new as new

      for each row

      begin

      if :old.check_status = '3' then

      raise_application_error (-20001,'*****!');

      return;

      end if;

      end;

      /

      ###建更新的触发器###

      create   or replace trigger tr_bis_exc_req_upd

      before update

      on bis_exc_req

      referencing old as old new as new

      for each row

      begin

      if :old.check_status = '3' then

      raise_application_error (-20001,'*******!');

      return;

      end if;

      end;

  • 相关阅读:
    Linux基础命令mv
    Linux基础命令cp
    闭包函数
    函数的嵌套
    函数对象
    global与nonlocal
    名称空间与作用域
    函数的参数(总结)
    函数的基本使用
    文件的操作之指针移动
  • 原文地址:https://www.cnblogs.com/kangjunyun/p/3282175.html
Copyright © 2020-2023  润新知