最近在初学Oracle,但自动增长这个问题一直都解决不了,请各位大侠帮我看一下应该怎么写才能达到又能执行插入多条语句,序列号又能增长!!!!
  代码是这样的:
   --创建序列号
   create sequence seq_table_列名
   increment by 1
   start with 1
   order
    nocache
  --创建学生表
 create table student
(
 id number ,
 name varchar(20)
)
然后我一次性执行了多条插入语句
insert all
  into student values(seq_table_列名.nextval,'张三')
  into student values(seq_table_列名.nextval,'李四')
select * from dual
commit但是结果是这样的:
 select * from student;    ID NAME
------ --------------------
     2 张三
     2 李四序列号没有改变。。请各位高手帮忙解决一下!!!

解决方案 »

  1.   

    insert all 
      into student values(select seq_table_列名.nextval from dual,'张三') 
      into student values(select seq_table_列名.nextval from dual,'李四') 
    select * from dual 
    这样ok?
      

  2.   

    呵呵。刚才搞定了、、
    改成块来执行这样就行
     declare
     begin
        insert into student values(seq_table_列名.nextval,'张三');
         insert into student values(seq_table_列名.nextval,'李四');
     end;
    谢谢你!!!
      

  3.   

    insert all
    本来就是为了插入的一致性而设计的
    而且
    insert all后面的select语句不允许用序列,但可以通过封装在函数内的方法变通一下
    create or replace function func return number
    as
    begin
    return seq_table_列名.nextval;
    end;
    再执行
    insert all 
      into student values(a,'张三') 
      into student values(a,'李四') 
    select func a from dual 
    试试
      

  4.   

    declare
    begin
       insert into student values(seq_table_列名.nextval,'张三');
        insert into student values(seq_table_列名.nextval,'李四');
    end;
    这样就行了呗
      

  5.   

    你是怎么写的?我自己测试过的
     create sequence seq_table_1 
      increment by 1 
      start with 1 
      order 
        nocache ;
      --创建学生表 
    create table student 

    id number , 
    name varchar(20) 
    );create or replace function func return number
    as
    begin
    return seq_table_1.nextval;
    end;insert all 
      into student values(a,'张三') 
      into student values(a,'李四') 
    select func a from dual ;
    commit ; select * from student;ID NAME
    1 张三
    1 李四
    2 张三
    2 李四
    3 张三
    4 李四--前4条记录是用你原来的代码产生的结果,最后两条记录是用上面的语句
      

  6.   

    --创建返回函数
      1  create or replace function func return number
      2  as
      3  begin
      4    return seq_table_1.nextval;
      5* end;
     警告: 创建的函数带有编译错误。SQL> show error
    FUNCTION FUNC 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/3      PL/SQL: Statement ignored
    4/22     PLS-00357: 在此上下文中不允许表, 视图或序列引用
             'SEQ_TABLE_1.NEXTVAL'
      

  7.   

    seq_table_1你创建这个序列了?
    将触发器改成
       create or replace function func return number 
        as 
        v number;
        begin 
          v:=seq_table_1.nextval;
          return v; 
       end; 试试
      

  8.   

    还是不行,你在你那台机测试可以吗?会不会是版本问题?我用的是10g,代码给你看一下:
    SQL> create sequence seq_table_1 
      2    increment by 1 
      3    start with 1 
      4    order 
      5      nocache ;序列已创建。SQL> create table student 
      2  ( 
      3  id number , 
      4  name varchar(20) 
      5  );表已创建。SQL> ed
    已写入 file afiedt.buf  1  create or replace function func return number
      2      as
      3      v number;
      4      begin
      5        v:=seq_table_1.nextval;
      6        return v;
      7*   end;
      8  /警告: 创建的函数带有编译错误。SQL> show error;
    FUNCTION FUNC 出现错误:LINE/COL ERROR
    -------- -----------------------------------------------------------------
    5/7      PL/SQL: Statement ignored
    5/22     PLS-00357: 在此上下文中不允许表, 视图或序列引用
             'SEQ_TABLE_1.NEXTVAL'
      

  9.   

    insert all
      into student values(seq_table_列名.nextval,'张三')
      into student values(seq_table_列名.nextval,'李四')
    select * from dual
    commit 
    你这么写,nextval只执行一次,如果需要nextval起作用,有2个方式
    1.使用bengin end 包含多条插入语句
    2.在表上建立触发器又触发器来维护那个字段,insert不需要管理那个字段
      

  10.   

    为什么改成块来执行这样就行了????能说一下吗?
    declare 
    begin 
        insert into student values(seq_table_列名.nextval,'张三'); 
        insert into student values(seq_table_列名.nextval,'李四'); 
    end; 
      

  11.   

    提供你一个利用存储过程的自增字段的插入方法:create or replace procedure pd_identitycolumn
    (
    table_name nvarchar2,
    column_name nvarchar2
    )
    as
    str_sql varchar2(1000);
    begin
    str_sql:='create sequence sequ_'||table_name||'
    minvalue 1
    maxvalue 1000000
    start with 1
    increment by 1
    nocache
    order';execute immediate str_sql;str_sql:='create or replace trigger trgg_'||table_name||'
    before insert on '||table_name||'
    for each row
    begin
    select sequ_'||table_name||'.nextval into :new.'||column_name||' from dual;
    end;';execute immediate str_sql;
    end;
    在执行上述存储过程时,oracle会在执行动态SQL的时候提示为用户赋予权限,以下就是执行该存储过程应该添加的权限:
           GRANT CREATE ANY SEQUENCE TO username;       GRANT CREATE ANY TRIGGER TO username;       GRANT CREATE ANY TABLE TO username;         GRANT CREATE ANY VIEW TO username; 
    编译执行后,下面就是为指定表字段添加自增属性:         begin
               pr_createidentitycolumn('usertable','tablecolumn');         end;
    针对你上面的应用:
    insert into sudent values('','张三');