猿问

从java调用Postgres存储过程,返回表

我做了一个 Postgres 存储过程:


CREATE OR REPLACE FUNCTION GetUser(ipUserId integer)

RETURNS setof users AS $$

BEGIN

  IF ipUserId is null THEN

    return query select * from users A order by modifieddate desc;

  END IF;

  return query select * from users where iduser = ipUserId;

END;

$$ LANGUAGE plpgsql;

我尝试在 Java 中像这样使用它:


    StoredProcedureQuery query = entityManager.createStoredProcedureQuery("GetUser").

            registerStoredProcedureParameter("ipUserId",

                    Integer.class, ParameterMode.IN)

            .registerStoredProcedureParameter("users",

                    List.class, ParameterMode.OUT)

            .setParameter("postId", 1);

或者


 StoredProcedureQuery query = entityManager.createStoredProcedureQuery("GetUser")

                .registerStoredProcedureParameter(1,void.class, ParameterMode.REF_CURSOR)

                .registerStoredProcedureParameter(2,Integer.class, ParameterMode.IN)

                .setParameter(2, ipIdUser);

我想将结果存储在一个列表中。


我应该怎么做,因为我遇到了各种错误?



当年话下
浏览 511回答 3
3回答

喵喵时光机

您可以尝试使用 CallableStatement。假设您的连接变量没问题:CallableStatement stmt = con.prepareCall("{call SCHEMA.PROCEDURE_NAME (?, ?)}");stmt.setInt(1, custom_var);stmt.registerOutParameter(2, OracleTypes.INTEGER);stmt.execute();得到结果: stmt.getInt(3); stmt.getString(4)如果你不能成功尝试使用 JdbcTemplate:SimpleJdbcCall call = new SimpleJdbcCall(this.jdbcTemplate).withSchemaName(SCHEMA).withProcedureName(PROC);MapSqlParameterSource params = new MapSqlParameterSource();params.addValue("ipUserId", custom_var);Map out = call.execute(params);要获得单个结果: Integer.parseInt("" + out.get("OUT_PARAM_NAME")); (String) out.get("OUT_PARAM_NAME2"));或者您可以将所有结果保存在一个列表中以供以后处理:SimpleJdbcCall call = new SimpleJdbcCall(this.jdbcTemplate);List<Map<String, Object>> rows = call.getJdbcTemplate().queryForList(PROC_STRING, new Object[] { param1, param2 });
随时随地看视频慕课网APP

相关分类

Java
我要回答