Postgres データベースに次の関数を作成しました。
CREATE FUNCTION funct(arg1 type1, arg2 type2, ...) RETURNS void AS $$
BEGIN
--insert passed args in some tables
END
この関数をJavaから呼び出して引数を適切に渡すにはどうすればよいですか?
Postgres データベースに次の関数を作成しました。
CREATE FUNCTION funct(arg1 type1, arg2 type2, ...) RETURNS void AS $$
BEGIN
--insert passed args in some tables
END
この関数をJavaから呼び出して引数を適切に渡すにはどうすればよいですか?
JDBC を使用して postgres と対話する方法を理解していれば (そうでない場合は、このチュートリアルで理解できるはずです)、このJDBC ページでは、ストアド関数を呼び出す方法を示します。
例えば:
// 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();
後者のリンクで説明されている他の種類のストアド関数もあります。
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 関数を呼び出すコードを記述しました。