从Java方法(在DAO层)调用存储过程(将记录插入到lsa_user_info表中)时获得PSQLException。

问题描述 投票:0回答:1

我是存储过程的新手。我想将一条有20列值的记录插入到 lsa_user_info 表。我正在调用一个存储过程来完成这个任务。

同时,我希望结果集能够返回被插入的记录的主键值(user_id). 但是,我却得到了这个错误。

org.postgresql.util.PSQLException: **列索引超出范围: 20,列数。19.

lsa_user_info 表定义:

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;
} 

请告诉我问题出在哪里?为什么我得到这个错误。

列索引超出范围:20,列数。19.

请帮助我 先谢谢你

java sql postgresql stored-procedures postgresql-9.6
1个回答
1
投票

函数中的变化 - 在表格中插入数据后,Function应该返回的是 user_id 你应该改变你的函数,如下所示

  1. 将返回类型从 NumericBigint
  2. 因为表列名和参数名相同,所以更改参数名。
  3. 使用 returning 声明与 insert into 返回插入的 user_id

码。

CREATE OR REPLACE FUNCTION PUBLIC.insert_user_info (
        param_email_id CHARACTER VARYING,
        param_first_name CHARACTER VARYING,
        param_last_name CHARACTER VARYING,
        param_modified_user_id INTEGER,
        param_status_id INTEGER,
        param_user_name CHARACTER VARYING,
        param_user_timezone CHARACTER VARYING,
        param_phone_extension CHARACTER VARYING,
        param_phone_direct CHARACTER VARYING,
        param_supervisor CHARACTER VARYING,
        param_title CHARACTER VARYING,
        param_fax CHARACTER VARYING,
        param_preferred_name CHARACTER VARYING,
        param_supervisor_phone CHARACTER VARYING,
        param_supervisor_extension CHARACTER VARYING,
        param_working_hrs CHARACTER VARYING,
        param_group_id CHARACTER VARYING,
        param_line_of_business INTEGER,
        param_system_admin_flag BOOLEAN,
        param_racfid CHARACTER VARYING 
    ) RETURNS BIGINT AS $BODY DECLARE
    x AS BIGINT BEGIN
        x = (
            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
            (
                param_email_id,
                param_first_name,
                param_last_name,
                param_modified_user_id,
                param_status_id,
                param_user_name,
                param_user_timezone,
                param_phone_extension,
                param_phone_direct,
                param_supervisor,
                param_title,
                param_fax,
                param_preferred_name,
                param_supervisor_phone,
                param_supervisor_extension,
                param_working_hrs,
                param_group_id,
                param_line_of_business,
                param_system_admin_flag,
                param_racfid 
            ) RETURNING user_id;
        
    ) RETURN x;

END $BODY$ LANGUAGE plpgsql VOLATILE COST 100;

JAVA代码的变化 - 在java代码中调用 Postgres Function 有别于 Stored procedureMySQL 或`Oracle。

public Integer invokeUserInfoStoredProc(UserInfoHibVO userInfoHibVO)throws Exception{
        log.info("********** Execcution 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!=storeProc)storedProcedure.close();
            log.info("Stored procedure insert_user_info() ended**************");
        }
        return generatedUserId;
    } 

遵循 参考资料 用于Java代码

© www.soinside.com 2019 - 2024. All rights reserved.