Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将生成的密钥从执行insert的DB2存储过程返回给JDBC?_Java_Jdbc_Db2 - Fatal编程技术网

Java 如何将生成的密钥从执行insert的DB2存储过程返回给JDBC?

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

我有一个简单的存储过程,它对具有标识主键列的表进行插入。我需要获取插入生成的密钥。我更喜欢使用标准的JDBCGetGeneratedKeys方法,但我不确定存储过程需要执行/返回什么来构建结果集。我的最终目标是在Hibernate中实现这一点。我还尝试使用selectidentity生成器,但它总是返回0。

在DB2/400上,似乎是identity\u VAL\u LOCAL()函数,它返回标识列最近分配的值


在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()不保持其值。