定义并使用sequence、trigger后,当使用insert into 语句插入一个值时,程序就报错,不能插入。为什么?
当定义了sequence、trigger后,在表中插入数据时,发现id值 并不是按每次均增加1,而是有时增加3,有时增加5,甚至有时增加了10,这又是为什么,怎么解决,有没有一段完整的代码,请大家帮忙看看。谢谢DROP TABLE IF EXISTS plan_rzfx;
CREATE TABLE plan_rzfx(
  id number PRIMARY KEY,
  projectID varchar2(36)
);comment on column plan_rzfx.ID is '唯一顺序号';
comment on column plan_rzfx.projectID is '项目的UUID号';CREATE SEQUENCE seqID_rzfx
START WITH 1 
INCREMENT BY 1;CREATE OR REPLACE TRIGGER triID_plan_rzfx
BEFORE INSERT ON plan_rzfx FOR EACH ROW
BEGIN 
SELECT seqID_seqID_rzfx.nextval INTO :NEW.ID FROM dual; 
END;  
/定义的insert如下:
create or replace function plan_rzfx_insert(projectid varchar2)return integer
/* *******************************************************************************************
--功    能:向表中插入一条数据
--输入参数:
   projectID:项目的唯一UUID 
--输出参数: 上传文件是否成功。成功 1,失败为 0  
--********************************************************************************************/
AS
begin
    insert into plan_rzfx_project(projectid) values(projectid);
     commit;
     return 1;
     
     exception /*如果发生异常*/
         WHEN OTHERS THEN
             ROLLBACK;
             return 0;/*失败*/
end plan_rzfx_insert;
/

解决方案 »

  1.   

    CREATE SEQUENCE seqID_rzfx 
    START WITH 1 
    INCREMENT BY 1
    NOCACHE;
      

  2.   

    谢谢。那我的insert语句为什么又会报错呢
      

  3.   

    可能和缓存有关系吧!
    CREATE SEQUENCE seqID_rzfx 
    START WITH 1 
    INCREMENT BY 1 
    NOCACHE;
    如果当plan_rzfx_insert函数中的插入操作失败,
    exception块中事务rollback了,但序列值是不会回退的。
      

  4.   

    那如何解决呢?plan_rzfx_insert函数为什么不能插入数据呢?是不是哪个地方写得不对
      

  5.   

    不能插入有可能是字符串的长度过大 length(projectid)> 36
    insert into plan_rzfx_project(projectid) values(projectid);
      

  6.   

    这个地方把不能插入的exception扔出来吧,看看是什么错误
    WHEN OTHERS THEN 
                ROLLBACK; 
                return 0;/*失败*/ 
    改成
    WHEN OTHERS THEN 
    RAISE;还有单独测试下insert语句,不使用函数,看是否可以插入