Java 如何将生成的密钥从执行insert的DB2存储过程返回给JDBC?
我有一个简单的存储过程,它对具有标识主键列的表进行插入。我需要获取插入生成的密钥。我更喜欢使用标准的JDBCGetGeneratedKeys方法,但我不确定存储过程需要执行/返回什么来构建结果集。我的最终目标是在Hibernate中实现这一点。我还尝试使用selectidentity生成器,但它总是返回0。在DB2/400上,似乎是identity\u VAL\u LOCAL()函数,它返回标识列最近分配的值Java 如何将生成的密钥从执行insert的DB2存储过程返回给JDBC?,java,jdbc,db2,Java,Jdbc,Db2,我有一个简单的存储过程,它对具有标识主键列的表进行插入。我需要获取插入生成的密钥。我更喜欢使用标准的JDBCGetGeneratedKeys方法,但我不确定存储过程需要执行/返回什么来构建结果集。我的最终目标是在Hibernate中实现这一点。我还尝试使用selectidentity生成器,但它总是返回0。在DB2/400上,似乎是identity\u VAL\u LOCAL()函数,它返回标识列最近分配的值 在DB2/400上,似乎是IDENTITY\u VAL\u LOCAL()函数,它为I
在DB2/400上,似乎是IDENTITY\u VAL\u LOCAL()函数,它为IDENTITY列返回最近分配的值
我从未尝试过identity val local()函数;在我自己的存储过程中,我只是在插入之后执行一个SELECT。但您可以让存储过程返回结果集:
create procedure proc1(
IN in_val
)
language sql
dynamic result sets 1
BEGIN
-- do insert
BEGIN
DECLARE c_out CURSOR WITH RETURN TO CLIENT FOR
select max(key) as inserted_key from table where val = in_val
FOR READ ONLY;
OPEN c_out;
END;
END;
您可能可以使用identity val local将select替换为“select identity val local()(来自sysibm.sysdummy1)”。我似乎无法让下划线在标记中起作用,但希望这是清楚的。我从未尝试过identity val local()函数;在我自己的存储过程中,我只是在插入之后执行一个SELECT。但您可以让存储过程返回结果集:
create procedure proc1(
IN in_val
)
language sql
dynamic result sets 1
BEGIN
-- do insert
BEGIN
DECLARE c_out CURSOR WITH RETURN TO CLIENT FOR
select max(key) as inserted_key from table where val = in_val
FOR READ ONLY;
OPEN c_out;
END;
END;
您可能可以使用identity val local将select替换为“select identity val local()(来自sysibm.sysdummy1)”。我似乎无法让下划线在markdown中工作,但希望这是清楚的。存储过程可以使用identity val local获取生成的值,并将其作为输出参数传递给Java程序。插入后选择不是一个好主意,因为其他进程可能已将新数据插入到表中,并会导致数据完整性问题 存储过程可以使用identity val local获取生成的值,并将其作为输出参数传递给Java程序。插入后选择不是一个好主意,因为其他进程可能已将新数据插入到表中,并会导致数据完整性问题 也可以从插入中选择:
SELECT pkey FROM FINAL TABLE (INSERT INTO tab(a, b, c, d) VALUES ... )
也可以从插入中选择:
SELECT pkey FROM FINAL TABLE (INSERT INTO tab(a, b, c, d) VALUES ... )
是,但当insert位于存储过程中并且需要在该过程退出后获取密钥时,这不起作用。可以再次将键值放入存储过程的out参数中,但我希望有一种方法可以干净地集成到Hibernate中,它允许您使用JDBC getGeneratedKeys方法或定义一个将获取最后一个键的查询。是的,但是,当insert在存储过程中,并且需要在过程退出后获取密钥时,这不起作用。可以再次将键值放入存储过程的out参数中,但我希望有一种方法可以干净地集成到Hibernate中,它允许您使用JDBC getGeneratedKeys方法或定义一个将获取最后一个密钥的查询。这是我目前的解决方案,但需要使用自定义Hibernate标识生成器。我希望有一种方法可以使用默认的Hibernate选项(getGeneratedKeys或使用identity_val_local()进行第二次选择)。您使用什么方法调用存储过程?看,这似乎是我能接近的。identity_val_local()在过程退出时不保持其值。这是我目前的解决方案,但它需要使用自定义的Hibernate标识生成器。我希望有一种方法可以使用默认的Hibernate选项(getGeneratedKeys或使用identity_val_local()进行第二次选择)。您使用什么方法调用存储过程?看,这似乎是我能接近的。过程退出时,identity_val_local()不保持其值。