【发布时间】:2015-10-19 10:45:17
【问题描述】:
我有一个插入postgresql的函数如下:
CREATE OR REPLACE FUNCTION insert_orderhead(order_id integer, order_dt text, customer_id integer, route_id integer, routenum integer, ordertype text, create_station_id integer, create_stationtype text, create_time text, create_user_id integer, tran_time text, tran_user_id integer) RETURNS integer AS $BODY$
INSERT INTO ordermaster
VALUES(DEFAULT,
order_dt,
customer_id,
route_id,
routenum,
ordertype,
create_station_id,
create_stationtype,
create_time,
create_user_id,
tran_time,
tran_user_id) returning order_id $BODY$ LANGUAGE SQL VOLATILE COST 100;
ALTER FUNCTION insert_orderhead(integer, text, integer, integer, integer, text, integer, text, text, integer, text, integer) OWNER TO postgres;
我使用java插入,调用如下:
cstorderhead = conn.prepareCall("{call insert_orderhead(?,?)}");
cstorderhead.setString(1, order_date);
cstorderhead.setInt(2, custidup);
.........
cstorderhead.executeUpdate();
值被正确插入。
我需要返回最后插入的 id,这里是串行自动增量。
我尝试如下:
ResultSet rstd = cstorderhead.getGeneratedKeys();
if (rstd.next()) {
int newId = rstd.getInt(1);
out.print("Value returned=="+newId);
}
但它没有返回最后插入的 id。我需要什么更改才能让我的代码得到它?
这是表定义:
create table ordermaster
(
order_id serial NOT NULL, order_dt text, customer_id integer, route_id integer, routenum integer, ordertype text, create_station_id integer, create_stationtype text, create_time text, create_user_id integer, tran_time text, tran_user_id integer, CONSTRAINT order_id PRIMARY KEY (order_id)
);
【问题讨论】:
-
如果您想从存储过程(或函数)中获取生成的密钥,那么您需要自己从函数中返回它。 JDBC 生成的密钥工具(顺便说一句,需要为语句显式启用)仅适用于普通 DML,并且对于可调用语句未指定。
-
不相关但是:你为什么将
date作为String传递。日期不应作为字符串值传递也不应存储。 -
@a_horse_with_no_name 我的日期是字符串格式 yyyymmdd 是字符串格式,所以这不是问题
-
将日期作为字符串传递是 一个问题。是什么阻止您存储
20150231? -
我说这无关紧要,但在
varchar列中存储日期仍然是一个非常糟糕的主意。
标签: java postgresql jdbc