2013-11-28 18 views
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;   
+0

[OUT 매개 변수로 CallableStatement 사용 예제] (http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/)를보십시오. – SudoRahul

+0

어이 기사를 검사했는데 루핑을 어떻게 관리해야합니까? 나는 데이터베이스에서 하나의 행을 얻지 못했지만 여러 행. – user1305398

+0

'execute'와'getMoreResults'의 리턴 값을 오해하고 있습니다. 또한 스토어드 프로 시저의 유형에 따라 값은'ResultSet' 대신에'CallableStatement' 자체를 통해 실제로 리턴 될 수 있습니다. –

답변

1

, 그

{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} 

하지만 당신이 양식을 사용한다면, 당신의 저장 프로 시저가 return a cursor을 수 있습니다.

관련 문제