2
일부 데이터를 반환하는 저장 프로 시저를 호출하는 Java 코드를 작성했습니다. 다음은 코드입니다. -예외 : 호출 문이 값을 반환하지 않음
CallableStatement callableStatement = null;
List<OutputDTO> outputDTOList = new LinkedList<>();
ResultSet rs = null;
String query = "{call Get_DailyCampaignReachReport (?,?,?,?,?,?,?,?,?)}";
try {
callableStatement = connMan.getReportingDbConnection().prepareCall(query);
Integer[] data = inDTO.getCampaignId().toArray(new Integer[inDTO.getCampaignId().size()]);
callableStatement.setDate(1, new Date(inDTO.getStartDate().toDate().getTime()));
callableStatement.setDate(2, new Date(inDTO.getEndDate().toDate().getTime()));
callableStatement.setArray(3, connMan.getReportingDbConnection().createArrayOf("integer", data));
callableStatement.setInt(4, inDTO.getNetworkId());
callableStatement.registerOutParameter(5, java.sql.Types.DATE);
callableStatement.registerOutParameter(6, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(7, java.sql.Types.INTEGER);
callableStatement.registerOutParameter(8, java.sql.Types.BIGINT);
callableStatement.registerOutParameter(9, java.sql.Types.BIGINT);
boolean results = callableStatement.execute();
while (results) {
rs = callableStatement.getResultSet();
while(rs.next()){
OutputDTO outputDTO = new OutputDTO();
outputDTO.setDate(new DateTime(rs.getDate(1).getTime()));
outputDTO.setCampaignId(rs.getInt(2));
outputDTO.setNetworkId(rs.getInt(3));
outputDTO.setUniques(rs.getInt(4));
outputDTO.setTotal(rs.getInt(5));
outputDTOList.add(outputDTO);
}
results = callableStatement.getMoreResults();
}
collector.setOutputList(outputDTOList);
} catch (SQLException e) {
throw new InternalErrorException("runDayReport {" + query + "} - ", e);
} finally {
try {
if (null != rs) {
rs.close();
}
if (null != callableStatement) {
callableStatement.close();
}
} catch (SQLException ee) {
throw new InternalErrorException("Free Resources : runDayReport {"
+ query + "} - " + ee);
}
}
"Get_DailyCampaignReachReport"는 저장 프로 시저의 이름입니다. 이제이 코드를 실행할 때 예외가 발생합니다. "Callable 문에서 값이 반환되지 않았습니다." 이것은 callablestatement에서 execute 메소드가 호출 될 때 발생합니다. 그러나 나는 이것이 왜 일어나고 있는지 이해할 수 없다. 누군가 내가 실수를하는 곳을 이해하도록 도와 줄 수 있습니까? 다음은 DB에서 저장 프로 시저를 찾는 방법입니다. 당신은 결과 매개 변수를 사용하지 않는
Schema | Name | Result data type | Argument data types | Type | Volatility | Owner | Language | Source code | Description
--------+------------------------------+------------------+---------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------+----------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- ------------------+-------------
public | get_dailycampaignreachreport | SETOF record | start_date date, end_date date, p_campaign_id integer[], p_network_id integer, OUT sqldate date, OUT campaign_id integer, OUT network_id integer, OUT uniques bigint, OUT total bigint | normal | volatile | postgres | plpgsql | +|
| | | | | | | | DECLARE +|
| | | | | | | | where_campaign_id text; +|
| | | | | | | | in_values varchar default ''; +|
| | | | | | | | BEGIN +|
| | | | | | | | IF p_campaign_id NOTNULL THEN +|
| | | | | | | | FOR i IN 1..array_upper(p_campaign_id, 1) LOOP +|
| | | | | | | | in_values := in_values || p_campaign_id[i] || ','; +|
| | | | | | | | END LOOP; +|
| | | | | | | | in_values := substring(in_values FROM 1 FOR character_length(in_values) - 1); +|
| | | | | | | | where_campaign_id := ' campaign_id IN (' || in_values || ')' ; +|
| | | | | | | | END IF; +|
| | | | | | | | RETURN QUERY EXECUTE 'SELECT sqldate,campaign_id,network_id,users,total FROM campaign_uniques_daily WHERE sqldate BETWEEN ' || quote_literal(start_date) || ' AND ' || quote_literal(end_date) || ' AND network_id = ' || p_network_id || ' AND ' || where_campaign_id || ' ';+|
| | | | | | | | END;
[OUT 매개 변수로 CallableStatement 사용 예제] (http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/)를보십시오. – SudoRahul
어이 기사를 검사했는데 루핑을 어떻게 관리해야합니까? 나는 데이터베이스에서 하나의 행을 얻지 못했지만 여러 행. – user1305398
'execute'와'getMoreResults'의 리턴 값을 오해하고 있습니다. 또한 스토어드 프로 시저의 유형에 따라 값은'ResultSet' 대신에'CallableStatement' 자체를 통해 실제로 리턴 될 수 있습니다. –