zoukankan      html  css  js  c++  java
  • Oracle中序列及触发器使用

    总结一下这次使用的序列和触发器,也把相应的一些操作用了一下。遇到的问题比较奇葩,仅供参考。

    一、序列部分(网上的)

    1、建立序列SEQUENCE

    create sequence user_seq increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;  

    语法:

    CREATE SEQUENCE s_id NOMAXVALUE NOCYCLE

    --INCREMENT BY 1    -- 每次加几个

    --START WITH 1      -- 从1开始计数

    --NOMAXVALUE        -- 不设置最大值

    --NOCYCLE       -- 一直累加,不循环

    --CACHE 10;     -- 缓存序列个数,有助于提高效率,但可能造成跳号

    如:create sequence sequenceName increment by 1  start with 1  minvalue 1 nomaxvalue   nocycle;

     

    2、查询序列号

       必须以管理员身份登录; 这个感觉没必要  

       sequence_owner必须为大写,不管你的用户名是否大写。只有大写才能识别。用户名区分大小写是真的

        --查看当前用户的所有序列   

    select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名';   

         --查询当前用户的序列总数   

    select count(*) from dba_sequences where sequence_owner='用户名';   

     

    3、得到序列的SQL语句

    select seq_newsid.nextval from sys.dual;

    4、删除序列的SQL

    DROP SEQUENCE seq_newsId;

     

    二、触发器部分(网上的)

    1、创建触发器

    创建一个基于该表的before insert 触发器,在触发器中使用刚创建的SEQUENCE。

    复制代码代码如下:

    create or replace trigger user_trigger   

    before insert on user  

    for each row   

    begin  

          select   user_seq.nextval  into:new.id from sys.dual ;   

    end user_trigger  ; 

     

    2、查all_triggers表得到trigger_name 

    select trigger_name from all_triggers where table_name='XXX';  

     

    3、根据trigger_name查询出触发器详细信息 

    select text from all_source where type='TRIGGER' AND name='TR_XXX';

     

    4、删除触发器

    DROP TRIGGER trigger_name;

     

    三、全过程(网上的)

    1、建立表

    复制代码代码如下:

    create table user  

    (   

        id   number(6) not null,   

        name   varchar2(30)   not null primary key  

    2、建立序列SEQUENCE

    复制代码代码如下:

    create sequence user_seq increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;  

    语法:

    CREATE SEQUENCE s_id NOMAXVALUE NOCYCLE

    --INCREMENT BY 1    -- 每次加几个

    --START WITH 1      -- 从1开始计数

    --NOMAXVALUE        -- 不设置最大值

    --NOCYCLE       -- 一直累加,不循环

    --CACHE 10;     -- 缓存序列个数,有助于提高效率,但可能造成跳号

    3、创建触发器

    创建一个基于该表的before insert 触发器,在触发器中使用刚创建的SEQUENCE。

    复制代码代码如下:

    create or replace trigger user_trigger   

    before insert on user  

    for each row   

    begin  

          select   user_seq.nextval  into:new.id from sys.dual ;   

    end user_trigger  ; 

     

     四、实际操作(自己做的)

    创建序列

    create sequence SEQ_LDTJXXB increment by 1  start with 1  minvalue 1 nomaxvalue   nocycle;

     

    创建触发器

    下面这段不行:

    create or replace trigger trigger_ldtjxxb before insert on ldtjxxb

    for each row

    begin

      select SEQ_LDTJXXB.nextval into:new.OBJECTID from dual;

      end;

     

    下面这段可以:

    create or replace trigger trigger_ldtjxxb

    --before

    before insert on ldtjxxb

    for each row

    begin

    select SEQ_LDTJXXB.nextval into :new.OBJECTID from dual;

    end;

    在PLSQL中运行上面那段不能满足我的需求,具体表现为在使用程序进行插入数据时,会报错,显示【触发器无效且未通过重新验证

    在百度的时候发现了这个http://bbs.csdn.net/topics/391842678,但和我的情况不一样,使用了2楼的代码后,惊奇的发现不报错了,就是这么奇葩,请恕我暂时还没能理解,开始怀疑师兄的插入程序有毒。

  • 相关阅读:
    linux 鼠标中键粘帖功能?!!
    mysql 学习笔记(一)
    log4j的使用 与 父接口 slf4j 门面模式(外观模式)
    web.xml 配置 文章汇总
    2019.08.04 新建随笔
    spring-事务的七个传播行为,最近想出去面试,了解一下框架知识
    20190710 tomcat下的项目导入到eclipse中
    20190709 关于web.xml中webAppRootKey的解释
    20160624 策略模式
    20190616 IDEA-每次修改JS文件都需要重启Idea才能生效解决方法
  • 原文地址:https://www.cnblogs.com/mcwym/p/6234928.html
Copyright © 2011-2022 走看看