从Java方法(位于DAO层)调用存储过程(将记录插入lsa_user_info表)时获取PSQLException
我不熟悉存储过程。我想在从Java方法(位于DAO层)调用存储过程(将记录插入lsa_user_info表)时获取PSQLException,java,sql,postgresql,stored-procedures,postgresql-9.6,Java,Sql,Postgresql,Stored Procedures,Postgresql 9.6,我不熟悉存储过程。我想在lsa\u user\u info表中插入一条具有20列值的记录。我正在调用一个存储过程来执行此任务 另外,我希望resultset将返回插入的记录的主键值(user\u id)。但是,我得到了这个错误: org.postgresql.util.PSQLException:*列索引超出范围:20,列数:19 lsa\u用户信息表格定义: CREATE TABLE public.lsa_user_info ( user_id integer NOT NULL
lsa\u user\u info
表中插入一条具有20列值的记录。我正在调用一个存储过程来执行此任务
另外,我希望resultset将返回插入的记录的主键值(user\u id
)。但是,我得到了这个错误:
org.postgresql.util.PSQLException:*列索引超出范围:20,列数:19
lsa\u用户信息
表格定义:
CREATE TABLE public.lsa_user_info
(
user_id integer NOT NULL DEFAULT nextval('lsa_user_info_user_id_seq'::regclass),
created_datetime timestamp without time zone,
created_user_id integer,
email_id character varying(255),
first_name character varying(255),
last_name character varying(255),
modified_datetime timestamp without time zone,
modified_user_id integer,
status_id integer,
user_name character varying(255),
user_timezone character varying,
phone_extension character varying,
phone_direct character varying(255),
supervisor character varying(255),
title character varying(255),
fax character varying(255),
preferred_name character varying(255),
state character varying(255),
supervisor_phone character varying(255),
supervisor_extension character varying(255),
loan_type character varying(255),
investor_name character varying(255),
language_indicator character varying(255),
working_hrs character varying(255),
group_id character varying(255),
racfid character varying(255),
uuid character varying(255),
agent_type character varying(100),
line_of_business integer DEFAULT 1,
system_admin_flag boolean DEFAULT false,
CONSTRAINT user_info_pkey PRIMARY KEY (user_id)
) WITH (OIDS=FALSE);
ALTER TABLE public.lsa_user_info
OWNER TO lsasdev;
GRANT ALL ON TABLE public.lsa_user_info TO lsasdev;
这是我的存储过程:
CREATE OR REPLACE FUNCTION public.insert_user_info(
email_id character varying,
first_name character varying,
last_name character varying,
modified_user_id integer,
status_id integer,
user_name character varying,
user_timezone character varying,
phone_extension character varying,
phone_direct character varying,
supervisor character varying,
title character varying,
fax character varying,
preferred_name character varying,
supervisor_phone character varying,
supervisor_extension character varying,
working_hrs character varying,
group_id character varying,
line_of_business integer,
system_admin_flag boolean,
racfid character varying) RETURNS numeric
AS
$BODY
BEGIN
INSERT INTO public.lsa_user_info(
email_id, first_name,last_name,
modified_user_id, status_id, user_name, user_timezone,
phone_extension, phone_direct, supervisor, title, fax,
preferred_name, supervisor_phone, supervisor_extension, working_hrs, group_id,
line_of_business, system_admin_flag,racfid) VALUES
( email_id, first_name,last_name,
modified_user_id, status_id, user_name, user_timezone,
phone_extension, phone_direct, supervisor, title, fax,
preferred_name, supervisor_phone, supervisor_extension, working_hrs, group_id,
line_of_business, system_admin_flag, racfid );
RETURN 1;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.insert_user_info(character varying, character varying, character varying,
integer, integer, character varying, character varying, character varying, character varying,
character varying, character varying, character varying, character varying, character varying,
character varying, character varying, character varying, integer, boolean, character varying)
OWNER TO lsasdev;
public Integer invokeUserInfoStoredProc(UserInfoHibVO userInfoHibVO)throws Exception{
log.info("********** Execcution of Stored Procedure insert_user_info() started ********");
ResultSet resultset =null;
Connection connection =null;
CallableStatement storedProcedure = null;
BigDecimal resp =null;
Session session = sessionFactory.getCurrentSession();
SessionImpl sessionImpl = (SessionImpl) session;
Integer generatedUserId = null;
try {
connection = sessionImpl.connection();
connection.setAutoCommit(false);
log.info("Connection to LSAS DB established successfully.");
storedProcedure = connection.prepareCall("{ ? = call
insert_user_info(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?}");
storedProcedure.registerOutParameter(1, Types.NUMERIC);
storedProcedure.setString(2,userInfoHibVO.getEmail());
storedProcedure.setString(3,userInfoHibVO.getFirstName());
storedProcedure.setString(4,userInfoHibVO.getLastName());
storedProcedure.setInt(5,userInfoHibVO.getModifiedUserId()!=null ? userInfoHibVO.getModifiedUserId() : 0);
storedProcedure.setInt(6,userInfoHibVO.getUserStatus().getStatusId());
storedProcedure.setString(7,userInfoHibVO.getUsername());
storedProcedure.setString(8,userInfoHibVO.getUserTimezone());
storedProcedure.setString(9,StringUtil.isNotEmpty(userInfoHibVO.getPhoneExtension()) ? userInfoHibVO.getPhoneExtension():"");
storedProcedure.setString(10,StringUtil.isNotEmpty(userInfoHibVO.getPhoneDirect()) ? userInfoHibVO.getPhoneDirect():"");
storedProcedure.setString(11,StringUtil.isNotEmpty(userInfoHibVO.getManager()) ? userInfoHibVO.getManager():"");
storedProcedure.setString(12,StringUtil.isNotEmpty(userInfoHibVO.getTitle()) ? userInfoHibVO.getTitle():"");
storedProcedure.setString(13,StringUtil.isNotEmpty(userInfoHibVO.getFax()) ? userInfoHibVO.getFax():"");
storedProcedure.setString(14,userInfoHibVO.getPreferredName());
storedProcedure.setString(15,StringUtil.isNotEmpty(userInfoHibVO.getSupervisorPhone())?userInfoHibVO.getSupervisorPhone():"");
storedProcedure.setString(16,userInfoHibVO.getSupervisorExtension());
storedProcedure.setString(17,StringUtil.isNotEmpty(userInfoHibVO.getWorkingHrs())? userInfoHibVO.getWorkingHrs():"");
storedProcedure.setString(18,StringUtil.isNotEmpty(userInfoHibVO.getGroup()) ? userInfoHibVO.getGroup():"");
storedProcedure.setInt(19,userInfoHibVO.getLob());
storedProcedure.setBoolean(20, false);
storedProcedure.setString(21,"");
storedProcedure.executeUpdate();
resp = (BigDecimal) storedProcedure.getObject(1);
resultset = storedProcedure.getGeneratedKeys();
if(resultset!=null && resultset.next())
generatedUserId= resultset.getInt(1);
log.info("********** Stored Procedure insert_user_info() Executed successfully ********");
}catch(Exception exp){
exp.printStackTrace();
log.error("Exception occurred in executing stored procedure for insert_user_info() data:" + exp);
}finally{
if(null!=resultset)resultset.close();
if(null!=storedProcedure)storedProcedure.close();
log.info("Stored proc insert_user_info() ended**************");
}
return generatedUserId;
}
这是我调用存储过程的代码:
CREATE OR REPLACE FUNCTION public.insert_user_info(
email_id character varying,
first_name character varying,
last_name character varying,
modified_user_id integer,
status_id integer,
user_name character varying,
user_timezone character varying,
phone_extension character varying,
phone_direct character varying,
supervisor character varying,
title character varying,
fax character varying,
preferred_name character varying,
supervisor_phone character varying,
supervisor_extension character varying,
working_hrs character varying,
group_id character varying,
line_of_business integer,
system_admin_flag boolean,
racfid character varying) RETURNS numeric
AS
$BODY
BEGIN
INSERT INTO public.lsa_user_info(
email_id, first_name,last_name,
modified_user_id, status_id, user_name, user_timezone,
phone_extension, phone_direct, supervisor, title, fax,
preferred_name, supervisor_phone, supervisor_extension, working_hrs, group_id,
line_of_business, system_admin_flag,racfid) VALUES
( email_id, first_name,last_name,
modified_user_id, status_id, user_name, user_timezone,
phone_extension, phone_direct, supervisor, title, fax,
preferred_name, supervisor_phone, supervisor_extension, working_hrs, group_id,
line_of_business, system_admin_flag, racfid );
RETURN 1;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.insert_user_info(character varying, character varying, character varying,
integer, integer, character varying, character varying, character varying, character varying,
character varying, character varying, character varying, character varying, character varying,
character varying, character varying, character varying, integer, boolean, character varying)
OWNER TO lsasdev;
public Integer invokeUserInfoStoredProc(UserInfoHibVO userInfoHibVO)throws Exception{
log.info("********** Execcution of Stored Procedure insert_user_info() started ********");
ResultSet resultset =null;
Connection connection =null;
CallableStatement storedProcedure = null;
BigDecimal resp =null;
Session session = sessionFactory.getCurrentSession();
SessionImpl sessionImpl = (SessionImpl) session;
Integer generatedUserId = null;
try {
connection = sessionImpl.connection();
connection.setAutoCommit(false);
log.info("Connection to LSAS DB established successfully.");
storedProcedure = connection.prepareCall("{ ? = call
insert_user_info(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?}");
storedProcedure.registerOutParameter(1, Types.NUMERIC);
storedProcedure.setString(2,userInfoHibVO.getEmail());
storedProcedure.setString(3,userInfoHibVO.getFirstName());
storedProcedure.setString(4,userInfoHibVO.getLastName());
storedProcedure.setInt(5,userInfoHibVO.getModifiedUserId()!=null ? userInfoHibVO.getModifiedUserId() : 0);
storedProcedure.setInt(6,userInfoHibVO.getUserStatus().getStatusId());
storedProcedure.setString(7,userInfoHibVO.getUsername());
storedProcedure.setString(8,userInfoHibVO.getUserTimezone());
storedProcedure.setString(9,StringUtil.isNotEmpty(userInfoHibVO.getPhoneExtension()) ? userInfoHibVO.getPhoneExtension():"");
storedProcedure.setString(10,StringUtil.isNotEmpty(userInfoHibVO.getPhoneDirect()) ? userInfoHibVO.getPhoneDirect():"");
storedProcedure.setString(11,StringUtil.isNotEmpty(userInfoHibVO.getManager()) ? userInfoHibVO.getManager():"");
storedProcedure.setString(12,StringUtil.isNotEmpty(userInfoHibVO.getTitle()) ? userInfoHibVO.getTitle():"");
storedProcedure.setString(13,StringUtil.isNotEmpty(userInfoHibVO.getFax()) ? userInfoHibVO.getFax():"");
storedProcedure.setString(14,userInfoHibVO.getPreferredName());
storedProcedure.setString(15,StringUtil.isNotEmpty(userInfoHibVO.getSupervisorPhone())?userInfoHibVO.getSupervisorPhone():"");
storedProcedure.setString(16,userInfoHibVO.getSupervisorExtension());
storedProcedure.setString(17,StringUtil.isNotEmpty(userInfoHibVO.getWorkingHrs())? userInfoHibVO.getWorkingHrs():"");
storedProcedure.setString(18,StringUtil.isNotEmpty(userInfoHibVO.getGroup()) ? userInfoHibVO.getGroup():"");
storedProcedure.setInt(19,userInfoHibVO.getLob());
storedProcedure.setBoolean(20, false);
storedProcedure.setString(21,"");
storedProcedure.executeUpdate();
resp = (BigDecimal) storedProcedure.getObject(1);
resultset = storedProcedure.getGeneratedKeys();
if(resultset!=null && resultset.next())
generatedUserId= resultset.getInt(1);
log.info("********** Stored Procedure insert_user_info() Executed successfully ********");
}catch(Exception exp){
exp.printStackTrace();
log.error("Exception occurred in executing stored procedure for insert_user_info() data:" + exp);
}finally{
if(null!=resultset)resultset.close();
if(null!=storedProcedure)storedProcedure.close();
log.info("Stored proc insert_user_info() ended**************");
}
return generatedUserId;
}
请让我知道是什么问题?为什么我会出现此错误:
列索引超出范围:20,列数:19
请帮助我!提前感谢函数的更改:在表中插入数据后,函数应返回插入行的
用户id
。你应该改变你的功能如下
Numeric
更改为Bigint
returning
语句和insert into
返回插入的用户id
public Integer invokeUserInfoStoredProc(UserInfoHibVO userInfoHibVO)throws Exception{
log.info("********** Execution of stored procedure insert_user_info() started ********");
ResultSet resultset =null;
Connection connection =null;
Long resp =null;
Session session = sessionFactory.getCurrentSession();
SessionImpl sessionImpl = (SessionImpl) session;
Integer generatedUserId = null;
try{
connection = sessionImpl.connection();
connection.setAutoCommit(false);
log.info("Connection to LSAS DB established successfully.");
String SQL="select * from insert_user_info(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?}"
PreparedStatement storedProcedure = connection.prepareStatement(SQL);
storedProcedure.setString(1,userInfoHibVO.getEmail());
storedProcedure.setString(2,userInfoHibVO.getFirstName());
storedProcedure.setString(3,userInfoHibVO.getLastName());
storedProcedure.setInt(4,userInfoHibVO.getModifiedUserId()!=null ?
userInfoHibVO.getModifiedUserId() : 0);
storedProcedure.setInt(5,userInfoHibVO.getUserStatus().getStatusId());
storedProcedure.setString(6,userInfoHibVO.getUsername());
storedProcedure.setString(7,userInfoHibVO.getUserTimezone());
storedProcedure.setString(8,StringUtil.isNotEmpty(userInfoHibVO.getPhoneExtension()) ?
userInfoHibVO.getPhoneExtension():"");
storedProcedure.setString(9,StringUtil.isNotEmpty(userInfoHibVO.getPhoneDirect())?
userInfoHibVO.getPhoneDirect():"");
storedProcedure.setString(10,StringUtil.isNotEmpty(userInfoHibVO.getManager())?
userInfoHibVO.getManager():"");
storedProcedure.setString(11,StringUtil.isNotEmpty(userInfoHibVO.getTitle())?
userInfoHibVO.getTitle():"");
storedProcedure.setString(12,StringUtil.isNotEmpty(userInfoHibVO.getFax())?
userInfoHibVO.getFax():"");
storedProcedure.setString(13,userInfoHibVO.getPreferredName());
storedProcedure.setString(14,StringUtil.isNotEmpty(userInfoHibVO.getSupervisorPhone())?userInfoHibVO.getSupervisorPhone():"");
storedProcedure.setString(15,userInfoHibVO.getSupervisorExtension());
storedProcedure.setString(16,StringUtil.isNotEmpty(userInfoHibVO.getWorkingHrs())?
userInfoHibVO.getWorkingHrs():"");
storedProcedure.setString(17,StringUtil.isNotEmpty(userInfoHibVO.getGroup())?
userInfoHibVO.getGroup():"");
storedProcedure.setInt(18,userInfoHibVO.getLob());
storedProcedure.setBoolean(19, false);
storedProcedure.setString(20,"");
resultset = storedProcedure.executeQuery();
if(resultset!=null && resultset.next())
generatedUserId= resultset.getLong(0);
log.info("********** Stored Procedure insert_user_info() Executed successfully ********");
}
catch(Exception exp){
exp.printStackTrace();
log.error("Exception occurred in executing stored procedure for insert_user_info() data:" + exp);
}
finally{
if(null!=resultset)resultset.close();
if(null != storedProcedure)storedProcedure.close();
log.info("Stored procedure insert_user_info() ended**************");
}
return generatedUserId;
}
遵循Java代码的说明