最近在初学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 李四序列号没有改变。。请各位高手帮忙解决一下!!!
代码是这样的:
--创建序列号
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 李四序列号没有改变。。请各位高手帮忙解决一下!!!
into student values(select seq_table_列名.nextval from dual,'张三')
into student values(select seq_table_列名.nextval from dual,'李四')
select * from dual
这样ok?
改成块来执行这样就行
declare
begin
insert into student values(seq_table_列名.nextval,'张三');
insert into student values(seq_table_列名.nextval,'李四');
end;
谢谢你!!!
本来就是为了插入的一致性而设计的
而且
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
试试
begin
insert into student values(seq_table_列名.nextval,'张三');
insert into student values(seq_table_列名.nextval,'李四');
end;
这样就行了呗
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条记录是用你原来的代码产生的结果,最后两条记录是用上面的语句
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'
将触发器改成
create or replace function func return number
as
v number;
begin
v:=seq_table_1.nextval;
return v;
end; 试试
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'
into student values(seq_table_列名.nextval,'张三')
into student values(seq_table_列名.nextval,'李四')
select * from dual
commit
你这么写,nextval只执行一次,如果需要nextval起作用,有2个方式
1.使用bengin end 包含多条插入语句
2.在表上建立触发器又触发器来维护那个字段,insert不需要管理那个字段
declare
begin
insert into student values(seq_table_列名.nextval,'张三');
insert into student values(seq_table_列名.nextval,'李四');
end;
(
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('','张三');