我在postgres数据库上创建了一个函数,比如
CREATE FUNCTION funct(arg1 type1, arg2 type2, ...) RETURNS void AS $$
BEGIN
--insert passed args in some tables
END
如何从java客户端调用此函数并正确传递args?
答案 0 :(得分:3)
如果您了解如何使用JDBC与postgres交谈(如果不是this tutorial可以让您加快速度),那么这个JDBC page会显示如何调用存储的函数:
例如:
// Setup function to call.
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION refcursorfunc() RETURNS refcursor AS '"
+ " DECLARE "
+ " mycurs refcursor; "
+ " BEGIN "
+ " OPEN mycurs FOR SELECT 1 UNION SELECT 2; "
+ " RETURN mycurs; "
+ " END;' language plpgsql");
stmt.close();
// We must be inside a transaction for cursors to work.
conn.setAutoCommit(false);
// Procedure call.
CallableStatement proc = conn.prepareCall("{ ? = call refcursorfunc() }");
proc.registerOutParameter(1, Types.OTHER);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
// do something with the results...
}
results.close();
proc.close();
在后一个链接上还讨论了其他类型的存储函数。
答案 1 :(得分:1)
我知道这有点老了,但我偶然发现了同样的问题并找到了解决方案。这非常简单,但我希望这有助于将来参考。
CallableStatement statement = connection.prepareCall(" { call function( ?, ?, ? ) } ");
statement.setInt(1, value);
statement.setInt(2, value);
statement.setInt(3, value);
statement.execute();
statement.close();
请注意,在执行sql代码中? =
之前没有call
,并且没有调用registerOutParameter
方法。
答案 2 :(得分:1)
调用postgresql函数/存储过程与正常的Sql调用略有不同。一段时间后我也面临类似的问题,我搜索了很多,然后我找到了解决方案。我正在分享解决方案。
下面是postgresql函数
Create or Replace Function myfunction(id integer) Returns Table(empid integer,empname charactervarying) AS
$BODY$
DECLARE
var_r record;
BEGIN
FOR var_r IN(
select * from emp where empno=id
)
LOOP
empid:=var_r.empno;
empname:=var_r.empname;
RETURN NEXT;
end LOOP;
END; $BODY$
LANGUAGE plsql VOLATILE
当我们将在postgresql控制台中运行查询时,它将根据表中存在的id = 5
的记录给出结果select myfunction(5);
现在我们必须编写代码来从java调用这个函数。下面是代码
public class Employee {
public static void main(String[] args) {
try {
callProc();
}Catch(SQLException e) {
e.printStackTrace();
}
}
public static void callProc () throws SQLException {
Connection con=DBConnection.getConnection();
Statement statement=con.createStatement();
//Call to postgresql function
String query=" call myfunction(?)";
CallableStatement ps=con.prepareCall(query);
ps.setInt(1,5) // it means we are setting value 5 at first index.
ResultSet rs=ps.executeQuery();
List<Emp> listOfEmp=new ArrayList<Emp>();
while(rs.next()){
Emp data=new Emp();
data.setEmpno(rs.getInt("empid"));
data.setEmpName(rs.getString("empid"));
listOfEmp.add(data);
}
system.out.println("Total emp"+listOfEmp.size());
}
}
在上面的例子中,我们编写了从java调用postgresql函数的代码。
有关详细信息,请参阅此内容 Postgresql Function with java
答案 3 :(得分:0)
使用createNativeQuery在您的交易中写下此内容并更改 myschema.mymethodThatReturnASelect 对于方案和你的功能名称。
@Override
public List<ViewFormulario> listarFormulario(Long idUsuario) {
List<ViewFormulario> list =null;
try {
Query q = em.createNativeQuery("SELECT * FROM myschema.mymethodThatReturnASelect(?);");
q.setParameter(1, idUsuario);
List<Object[]> listObject = (List<Object[]>) q.getResultList();
if (listObject != null && !listObject.isEmpty()) {
list = new ArrayList<>();
for (Object o[] : listObject) {
ViewFormulario c = new ViewFormulario();
c.setIdProyecto(o[0] != null ? Long.valueOf(o[0].toString()) : -1L);
c.setIdUsuario(o[1] != null ? Integer.valueOf(o[1].toString()) : -1);
c.setIsCreador(o[2] != null ? Boolean.valueOf(o[2].toString()) : null);
c.setIdPadre(o[3] != null ? Long.valueOf(o[3].toString()) : -1L);
c.setNombre(o[4] != null ? o[4].toString() : "");
c.setNombreCliente(o[5] != null ? o[5].toString() : "");
c.setCodigo(o[6] != null ? o[6].toString() : "");
c.setEstado(o[7] != null ? Long.valueOf(o[7].toString()) : -1L);
c.setTotalDisponible(o[8] != null ? Double.valueOf(o[8].toString()) : 0.0);
c.setCantidadAlmacenamiento(o[9] != null ? Double.valueOf(o[9].toString()) : 0.0);
c.setPorcentajeAlmacenamiento(o[10] != null ? Double.valueOf(o[10].toString()) : 0.0);
c.setCantidadUsuario(o[11] != null ? Long.valueOf(o[11].toString()) : 0);
c.setCantidadRegistros(o[12] != null ? Long.valueOf(o[12].toString()) : 0);
c.setMbFoto(o[13] != null ? Double.valueOf(o[13].toString()) : 0.0);
c.setMbVideo(o[14] != null ? Double.valueOf(o[14].toString()) : 0.0);
c.setMbTexto(o[15] != null ? Double.valueOf(o[15].toString()) : 0.0);
list.add(c);
}
}
} catch (Exception e) {
System.out.println("listarFormulario " + e.getMessage());
}
return list;
}