Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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方法(位于DAO层)调用存储过程(将记录插入lsa_user_info表)时获取PSQLException_Java_Sql_Postgresql_Stored Procedures_Postgresql 9.6 - Fatal编程技术网

从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
  • 代码:

    JAVA代码的变化:在JAVA代码中,Postgres函数的调用不同于MySQL或Oracle的存储过程

    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代码的说明