2017-02-06 2 views
0

以下は、my javaストアドプロシージャーです。これはJavaコード内で呼び出すものです。 テーブル名と制限値を動的にチェックしています。これはmysqlコマンドラインの中で動作しています。複数のPREPAREステートメントでのMysqlプロシージャーの問題

問題は、このプロシージャをjava内でコールし、結果セットから読み取るときに、無効な列の例外が発生する場合です。ここで

 `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` 

Javaコードは(私のテーブルには、シンボルとDESCRIPTION列があります)です。

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(); 
} 

例外 "列 'SYMBOL' が見つかりません。"

これが私のテーブルです:

+--------------------+---------------+------+-----+---------------------+-------+ 
| 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 RES = 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(); 

}

関連する問題