Orcale中返回自动增长主键问题

时间:2021-06-02 13:50:47
用存储过程,向表中name,sex,phone插入数据,ID为主键,自动增长,现在要在insert之后立刻返回ID,这个存储过程应该怎么写

10 个解决方案

#1


存储过程是没有返回值的

#2


创建一个序列sequence
id用序列来自动增长,最后返回就返回你序列所取的nextval

#3


引用 1 楼 zhuomingwang 的回复:
存储过程是没有返回值的

存储过程有返回值,out参数就可以作为返回值啊,只是没理解楼主为什么这么简单的问题要用过程去做?到底需求是什么?

#4


returning

#5


这么说吧  我现在在做一个问答系统  用的是SSH框架(领导要我用这个框架做= =没办法,杀鸡用牛刀)
这个系统的功能是  用户在一个页面提交题目,问题后,后台插入数据库中,并返回一个数字,有一个页面是给用户使用这个数字来查找自己的问题,我这里将主键ID作为这个数字返回给用户。。。但发现在底层DAO中不怎么会写返回ID的方法= = 所以想到了用存储过程,要是有人能教下怎么写这个存储过程最好了

#6


SQL> create table t_test_return
  2  (id number(20),
  3   name varchar2(100));
 
Table created
 
SQL> 
SQL> create sequence seq_test_return
  2  minvalue 1
  3  maxvalue 999999999999999999999999999
  4  start with 1
  5  increment by 1;
 
Sequence created
 
SQL> 
SQL> create or replace trigger tri_test_return
  2    before insert on t_test_return
  3    for each row
  4  declare
  5    -- local variables here
  6  begin
  7    select seq_test_return.nextval into :new.id from dual;
  8  end tri_test_return;
  9  /
 
Trigger created
 
SQL> insert into t_test_return(name)values('a');
 
1 row inserted
 
SQL> select * from t_test_return;
 
                   ID NAME
--------------------- --------------------------------------------------------------------------------
                    1 a
 
SQL> 
SQL> create or replace procedure proc_pass_col_name
  2  
  3  as
  4  v_id number(20);
  5  begin
  6    insert into t_test_return(name)values('b') returning id into v_id;
  7    dbms_output.put_line(v_id);
  8  end;
  9  /
 
Procedure created
 
SQL> set serveroutput on
SQL> exec proc_pass_col_name;
 
2
 
PL/SQL procedure successfully completed
 
SQL> 

#7


SQL> select * from t_test_return;
 
                   ID NAME
--------------------- --------------------------------------------------------------------------------
                    1 a
                    2 b
 
SQL> 

#8


说错了  是能有Hibernate的DAO方法最好= = 不过谢谢minitoy  我试试你的存储过程

#9


Hibernate的save对象后直接再次获取对象的ID,应该是可以的

#10


9L 求代码~~

#1


存储过程是没有返回值的

#2


创建一个序列sequence
id用序列来自动增长,最后返回就返回你序列所取的nextval

#3


引用 1 楼 zhuomingwang 的回复:
存储过程是没有返回值的

存储过程有返回值,out参数就可以作为返回值啊,只是没理解楼主为什么这么简单的问题要用过程去做?到底需求是什么?

#4


returning

#5


这么说吧  我现在在做一个问答系统  用的是SSH框架(领导要我用这个框架做= =没办法,杀鸡用牛刀)
这个系统的功能是  用户在一个页面提交题目,问题后,后台插入数据库中,并返回一个数字,有一个页面是给用户使用这个数字来查找自己的问题,我这里将主键ID作为这个数字返回给用户。。。但发现在底层DAO中不怎么会写返回ID的方法= = 所以想到了用存储过程,要是有人能教下怎么写这个存储过程最好了

#6


SQL> create table t_test_return
  2  (id number(20),
  3   name varchar2(100));
 
Table created
 
SQL> 
SQL> create sequence seq_test_return
  2  minvalue 1
  3  maxvalue 999999999999999999999999999
  4  start with 1
  5  increment by 1;
 
Sequence created
 
SQL> 
SQL> create or replace trigger tri_test_return
  2    before insert on t_test_return
  3    for each row
  4  declare
  5    -- local variables here
  6  begin
  7    select seq_test_return.nextval into :new.id from dual;
  8  end tri_test_return;
  9  /
 
Trigger created
 
SQL> insert into t_test_return(name)values('a');
 
1 row inserted
 
SQL> select * from t_test_return;
 
                   ID NAME
--------------------- --------------------------------------------------------------------------------
                    1 a
 
SQL> 
SQL> create or replace procedure proc_pass_col_name
  2  
  3  as
  4  v_id number(20);
  5  begin
  6    insert into t_test_return(name)values('b') returning id into v_id;
  7    dbms_output.put_line(v_id);
  8  end;
  9  /
 
Procedure created
 
SQL> set serveroutput on
SQL> exec proc_pass_col_name;
 
2
 
PL/SQL procedure successfully completed
 
SQL> 

#7


SQL> select * from t_test_return;
 
                   ID NAME
--------------------- --------------------------------------------------------------------------------
                    1 a
                    2 b
 
SQL> 

#8


说错了  是能有Hibernate的DAO方法最好= = 不过谢谢minitoy  我试试你的存储过程

#9


Hibernate的save对象后直接再次获取对象的ID,应该是可以的

#10


9L 求代码~~