2017-02-06 2 views
0

다음은 내 mysql 저장 프로 시저입니다.이 프로 시저는 Java 코드 내부에서 호출합니다. 동적으로 테이블 이름과 한계 값을 확인하고 있습니다. 그것은 mysql 커맨드 라인에서 작동합니다.다중 PREPARE 문을 가진 MySQL 프로 시저 문제

문제는 자바 내부에서이 프로 시저를 호출하고 결과 집합에서 읽기를 시도하면 잘못된 열 예외가 발생합니다. 여기

 `CREATE DEFINER=`root`@`localhost` PROCEDURE `top_gainers`(
      IN sExchange VARCHAR (24), 
      IN iLimit INT, 
      OUT sStatus VARCHAR(10), 
      OUT sMessage VARCHAR(40) 
     ) 
     BEGIN 

    SET sStatus = '0'; 

    IF sExchange = '' OR iLimit = '' 
    THEN 
     SET sStatus = '1'; 
     SET sMessage = 'Parameter is missing'; 
    END IF; 

    SET @table_test = CONCAT('SHOW TABLES LIKE \'', sExchange,'\''); 
    PREPARE stmnt FROM @table_test; 
    EXECUTE stmnt; 
    DEALLOCATE PREPARE stmnt; 
    IF FOUND_ROWS() = 0 
    THEN 
     SET sStatus = '2'; 
     SET sMessage = 'Invalid exchange selected'; 
    END IF; 

    IF sStatus = '0' 
    THEN 
     SET @text = CONCAT('SELECT * FROM ', sExchange, ' ORDER BY CHANGE_PER DESC LIMIT ', iLimit); 
     PREPARE stmnt FROM @text; 
     EXECUTE stmnt; 
     DEALLOCATE PREPARE stmnt; 
     IF FOUND_ROWS() = 0 
     THEN 
      SET sStatus = '3'; 
      SET sMessage = 'Could not find relevant data'; 
     ELSE 
      SET sMessage = 'Market movers fetched successfully'; 
     END IF; 
    END IF; 

END` 

는 자바 코드 (내 표는 SYMBOL 및 설명 열이있다) ". 열 'SYMBOL'을 (를) 찾을 수 없습니다"

conn = DBConnection.getInstance().getConnection();  
String sQuery = "{CALL top_gainers(?, ?, ?, ?)}"; 
cstmt = conn.prepareCall(sQuery); 
cstmt.setString(1, sExchange); // "NSE" 
cstmt.setString(2, sLimit); // "10" 
cstmt.registerOutParameter(3, java.sql.Types.VARCHAR); 
cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);  
boolean hasResult = cstmt.execute();  
JSONArray jArray = new JSONArray();  
while (hasResult) {  
    ResultSet res = cstmt.getResultSet();  
    sStatus = cstmt.getString("sStatus"); 
    sMessage = cstmt.getString("sMessage");  
    if (sStatus.equals("0")) {  
     while (res.next()) { 
      JSONObject jObj = new JSONObject();  
      jObj.put("symbol", res.getString("SYMBOL")); 
      jObj.put("description", res.getString("DESCRIPTION"));  
      jArray.put(jObj); 
     } 
    }  
    DBConnection.closeResultSet(res);  
    hasResult = cstmt.getMoreResults(); 
} 

예외

+--------------------+---------------+------+-----+---------------------+-------+ 
| Field    | Type   | Null | Key | Default    | Extra | 
+--------------------+---------------+------+-----+---------------------+-------+ 
| SYMBOL    | varchar(255) | NO | PRI |      |  | 
| DESCRIPTION  | varchar(255) | YES |  | NULL    |  | 
--------------------------------------------------------------------------------+ 
+0

당신은 어떻게 정확한 예외를 제공시겠습니까? – yeputons

+0

항상 정확한 예외 메시지를 포함하십시오. –

+0

이것이 "열 'SYMBOL'을 찾을 수 없습니다."라는 메시지입니다. – JintoThomas

답변

0

문제 발견 :

내 테이블입니다. 내 프로시 저는 2 개의 결과 집합을 반환하고 테이블 이름 (유효한 테이블 이름 인 경우)이있는 첫 번째 집합의 맨 위에 'SYMBOL'열에 액세스하려고 시도했습니다

Java 코드에 다음 줄을 추가했습니다. 값에 액세스하기 전에 열 수를 확인했습니다.

ResultSetMetaData rsmd = res.getMetaData(); 
int columnsNumber = rsmd.getColumnCount(); 

동안 (hasResult) { ResultSet의 입술 cstmt.getResultSet =();

ResultSetMetaData rsmd = res.getMetaData(); 
int columnsNumber = rsmd.getColumnCount(); 

sStatus = cstmt.getString("sStatus"); 
sMessage = cstmt.getString("sMessage"); 

if (columnsNumber > 1) { 

    while (res.next()) { 

    JSONObject jObj = new JSONObject(); 
    jObj.put(APP_CONSTANT.SYMBOL, res.getString("SYMBOL")); 
    jObj.put(APP_CONSTANT.DESCRIPTION, res.getString("DESCRIPTION")); 
    jArray.put(jObj); 

    } 
} 

DBConnection.closeResultSet(res); 

hasResult = cstmt.getMoreResults(); 

은}