2017-04-19 100 views
0

SimpleJDBCCallを使用してREF_CURSORでPostgreSQLストアドプロシージャを呼び出したいとします。SimpleJdbcCallとREF_CURSORを使用したPostgreSQLストアドプロシージャの呼び出し

org.postgresql.util.PSQLException: ERROR: cursor "cursor" does not exist 
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270) 
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1998) 
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:570) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:406) 
at org.postgresql.jdbc2.AbstractJdbc2Connection.execSQLQuery(AbstractJdbc2Connection.java:339) 
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.internalGetObject(AbstractJdbc2ResultSet.java:213) 
at org.postgresql.jdbc3.AbstractJdbc3ResultSet.internalGetObject(AbstractJdbc3ResultSet.java:36) 
at org.postgresql.jdbc4.AbstractJdbc4ResultSet.internalGetObject(AbstractJdbc4ResultSet.java:312) 
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getObject(AbstractJdbc2ResultSet.java:2711) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:457) 
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:413) 
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1068) 
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1066) 
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1016) 
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1066) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:397) 
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:369) 
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:173) 

私がテストした:私は、エラーメッセージを受信したコードを実行する

JdbcTemplate jdbcTemplate = new JdbcTemplate(getDataSource()); 
    jdbcTemplate.setResultsMapCaseInsensitive(true); 


    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate); 
    jdbcCall.withFunctionName("procName").returningResultSet("cursor", 
      BeanPropertyRowMapper.newInstance(CustomEntity.class)); 

    Map m = jdbcCall.execute(); 

CREATE OR REPLACE FUNCTION public.procName() 
RETURNS refcursor AS 
$BODY$ 
    DECLARE 
    ref1 refcursor := 'cursor'; 
BEGIN 
    open ref1 for SELECT * FROM public."tableName"; 
    RETURN ref1; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100; 
ALTER FUNCTION public.procName() 
OWNER TO postgres; 

は、私は次のJavaコードを使用してプロシージャを呼び出そうとしました:私のストアドプロシージャは次のようになりますこのコードはOraceleストアドプロシージャを使用し、REF_CURSORも使用します。私はwithFunctionName()の代わりにwithProcedureName()メソッドを使用しました。ストアドプロシージャが正しく呼び出され、結果が返されます。

SimpleJDBCCallを使用してREF_CURSORを返すPostreSQLストアドプロシージャを呼び出す方法はありますか?

答えて

-1
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("genidproc"); 
HashMap<String, Object> params = new HashMap<String, Object>(); 
params.put("keystr", "uno"); 
Map<String, Object> result = call.execute(params); 
for (String s : result.keySet()) { 
    pw.println("6.0 " + result.get(s)); 
} 
+0

このコードスニペットは、(// meta.stackexchange.com/questions/114762/explaining-entirely-コードベース - 回答)[説明を含む]溶液が、本当に改善するのに役立つかもしれないがあなたの投稿の質。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – peacetype

関連する問題