从java调用postgres上的存储函数

时间:2013-07-02 20:15:19

标签: postgresql stored-procedures jdbc

我在postgres数据库上创建了一个函数,比如

CREATE FUNCTION funct(arg1 type1, arg2 type2, ...) RETURNS void AS $$
BEGIN
--insert passed args in some tables
END

如何从java客户端调用此函数并正确传递args?

4 个答案:

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