SQL基础-- 序列 SEQUENCE 同义词 SYNONYM

               

--=============================================

--SQL基础--> 序列(SEQUENCE)、同义词(SYNONYM)

--=============================================

 

一、序列

    是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常用于产生主键值

    类似于SQL server中的IDENTITY(int,1,1) 或者列为IDENTITY列。SQL server可以直接将列指定

    IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL

    server 中主键的产生更为简便。

   

    1.序列的特性:

       自动提供唯一的数值

       共享对象

       主要用于提供主键值

       代替应用代码

       将序列值装入内存可以提高访问效率

 

    2.CREATE SEQUENCE 语句定义序列:

 

       CREATE SEQUENCE sequencename

       [INCREMENT BY n]             定义序列增长步长,省略为1

       [START WITH m]               序列起始值,省略为1

       [{MAXVALUE n | NOMAXVALUE}] 序列最大值,NOMAXVALUE升序时,序列最大值的次方

                                    降序时为-(默认也是为此)

       [{MINVALUE n | NOMINVALUE}] 序列最小值,NOMINVALUE升序时,最小值为,降序时序列

                                    最小值为-的次方(默认也是为此)

       [{CYCLE | NOCYCLE}]         到达最大值或最小值后,继续产生序列(默认NOCYCLE

       [{CACHE n | NOCACHE}];       序列缓存与否(默认NOCACHE

   

        关于创建序列,使用序列所需要的权限请参考:Oracle

                         

       --创建一个序列

           SQL> CREATE SEQUENCE my_seq

             2  INCREMENT BY 10

             3  START WITH 100

             4  MAXVALUE 150

             5  NOCACHE

             6  NOCYCLE;

 

           Sequence created.

 

    3.使用序列

       NEXTVAL CURRVAL 伪列

           NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用

           CURRVAL 中存放序列的当前值

           第一次使用时CURRVAL不能用

           使用时需要指定序列的对象名

           将序列值装入内存可提高访问效率

       序列在下列情况下出现裂缝:

           回滚

           系统异常

           多个表同时使用同一序列

       如果不将序列的值装入内存(NOCACHE), 可使用表USER_SEQUENCES 查看序列当前的有效值

          

       --当第一次使用序列时指定了currval列,结果出现如下错误提示    

           SQL> SELECT my_seq.currval FROM dual;

           SELECT my_seq.currval FROM dual

                 *

           ERROR at line 1:

           ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

 

       --使用nextval列,则成功执行,这就是NEXTVAL 必须在CURRVAL 之前指定,及第一次使用必须是NEXTVAL

           SQL> SELECT my_seq.nextval FROM dual;

 

              NEXTVAL

           ----------

                 100

 

           SQL> SELECT my_seq.currval FROM dual;

 

              CURRVAL

           ----------

                 100 

      

    4.查询序列

       USER_SEQUENCES

       DBA_SEQUENCES

       ALL_SEQUENCES

       查询数据字典视图USER_SEQUENCES获取序列定义信息

       如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值

 

       SQL> SELECT sequence_name,min_value,max_value

         2      increment_by,cycle_flag,order_flag,

         3      cache_size,last_number

         4  FROM user_sequences

         5  WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');

 

       SEQUENCE_NAME                   MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER

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

       MY_SEQ                                  1          150 N N          0         110

       SEQ1                                    1          200 Y N          0         110

       SEQ2                                    1          200 Y N          0          31

   

    5.序列应用举例:

       SQL> conn robinson/lion

       Connected.

       SQL> ALTER TABLE robinson.dept MODIFY(deptno NUMBER);

 

       Table altered.

 

       --出现了下面的错误,怀疑是授权的问题

           SQL> INSERT INTO robinson.dept(deptno,dname,loc)

             2  VALUES(my_seq.currval,'Customers','HongKong');

           VALUES(my_seq.currval,'Customers','HongKong')

                 *

           ERROR at line 2:

           ORA-02289: sequence does not exist

 

       --使用sys帐户授权成功

           SQL> conn sys as sysdba       

           Enter password:

           Connected.

           SQL> GRANT ALL ON my_seq TO robinson;

 

           Grant succeeded.

 

       --查看权限已被成功授予

           SQL> select grantee,owner,table_name,grantor,privilege from user_tab_privs;

 

           GRANTEE    OWNER      TABLE_NAME    GRANTOR        PRIVILEGE

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

           ROBINSON   SCOTT      EMP           SCOTT          SELECT

           ROBINSON   SYS        MY_SEQ        SYS            SELECT

           ROBINSON   SYS        MY_SEQ        SYS            ALTER

 

 

       --成功授权之后还是出现同样的提示

           SQL> INSERT INTO robinson.dept(deptno,dname,loc)

             2  VALUES(my_seq.currval,'Customers','HongKong');

           VALUES(my_seq.currval,'Customers','HongKong')

                 *

           ERROR at line 2:

           ORA-02289: sequence does not exist

 

       --sequence名字前增加schema sys ,出现了如下提示

           SQL> INSERT INTO robinson.dept(deptno,dname,loc)

             2  VALUES(sys.my_seq.currval,'Customers','HongKong');

           VALUES(sys.my_seq.currval,'Customers','HongKong')

                     *

           ERROR at line 2:

           ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

 

       --修改currvalnextval,操作成功

           SQL> INSERT INTO robinson.dept(deptno,dname,loc)

             2  VALUES(sys.my_seq.nextval,'Customers','HongKong');

 

           1 row created.

 

           SQL> SELECT * FROM dept;                              

 

              DEPTNO DNAME          LOC

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

                  10 ACCOUNTING     NEW YORK

                  20 RESEARCH       DALLAS

                  30 SALES          CHICAGO

                  40 OPERATIONS     BOSTON

                 110 Customers      HongKong

 

       --第二次使用currval可以成功执行,因该表未设置主键,故未提示冲突     

           SQL> INSERT INTO robinson.dept(deptno,dname,loc)

             2  VALUES(sys.my_seq.currval,'Customers','HongKong');

 

           1 row created.

 

           SQL> SELECT * FROM dept;

 

              DEPTNO DNAME          LOC

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

                  10 ACCOUNTING     NEW YORK

                  20 RESEARCH       DALLAS

                  30 SALES          CHICAGO

                  40 OPERATIONS     BOSTON

                 110 Customers      HongKong

                 110 Customers      HongKong

 

    6.修改序列

       修改序列的增量, 最大值, 最小值, 循环选项

猜你喜欢

转载自blog.csdn.net/fsfsdfsdw/article/details/86537253
今日推荐