2017-05-30 7 views
0

次のコードを使用してコードが存在するかどうかを確認します。同じコードがない場合、executeQuery()は問題ありません。ORA-00904データが存在する場合のエラー

public boolean isExist(String code) throws DataBaseException { 
    boolean isExist = false; 

    StringBuffer querySql = new StringBuffer(); 
    querySql.append(" SELECT "); 
    querySql.append(" MY_CODE "); 
    querySql.append(" FROM "); 
    querySql.append(" MY_MST "); 
    querySql.append(" WHERE "); 
    querySql.append(" MY_CODE = ? "); 

    try { 
     super.setQuerySql(querySql.toString()); 
     super.addParameter(Types.VARCHAR, code); 
     List<Object> resultsList = super.executeQuery(); 

     if (resultsList != null && resultsList.size() > 0) { 
      isPsiExist = true; 
     } 
    } catch (Exception e) { 
     throw new DataBaseException(e, "Can't get the code.", this.getClass().getName(), querySql.toString()); 
    } 

    return isExist; 
} 

ただし、コードが存在する場合は、ORA-00904が発生します。その理由を教えてください。どうすればこの問題を解決できますか?

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT MY_CODE FROM MY_MST WHERE MY_CODE = ? ]; nested exception is java.sql.SQLException: invalid identifier. 
+1

以下のように変更した後、okです?' 。 –

+0

super.addParameterがNGですか?しかし、私がINSERTと同じ方法を使用しても、問題はありません。 – mikezang

+0

NGの意味は分かりません。ヘルプが必要な場合は、関連するコードを投稿してください。 –

答えて

0

あなたはプリペアドステートメントを使用するように試みは正しい軌道に乗って間違いですが、JDBCで準備されたステートメントを使用する方法について混乱しているようです。

super.setQuerySql(querySql.toString()); 
super.addParameter(Types.VARCHAR, code); 
List<Object> resultsList = super.executeQuery(); 

問題は、それがパラメータを設定しません

super.addParameter(Types.VARCHAR, code); 

です:あなたはPreparedStatementのために独自のクラスを使用しているようだ

String sql = "SELECT CODE FROM MY_MST WHERE CODE = ?"; 
try { 
    PreparedStatement ps = dbConnection.prepareStatement(sql); 
    ps.setString(1, code); 
    ResultSet rs = ps.executeQuery(); 
    while (rs.next()) { 
     // process the current row 
    } 
} 
catch (SQLException e) { 
    // handle exception 
} 
+0

私のコードにdbConnectionはありません.... – mikezang

0

:あなたは、次のパターンを使用する必要があります。

しかし、それを表示しないので、より具体的な回答をすることは容易ではありません。

とにかく、動作するものを再発明しようとしないでください。ジョブを実行するPreparedStatementを使用します。
本当に便利な場合は、そのクラスを含むラッパークラスを使用できますが、基本的にクエリーを行い、その結果を利用することができます。

0

mapRowメソッドで複数の列が使用されたため、エラーが発生しました。ご迷惑をおかけして申し訳ありません。

protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException { 
    ... 
    psi.setCode(resultSet.getString("MY_CODE")); 
    psi.setName(resultSet.getString("NAME")); 
    ... 
} 

今では、私はそれが文字通りのクエリを実行するのでWHERE MY_CODE `= MY_MST FROM MY_CODEを選択して、あなたのスーパークラス明らかに正しくパラメータを扱っていない

protected Object mapRow(ResultSet resultSet, int rowNumber) throws SQLException { 
    ... 
    ResultSetMetaData rsmd = resultSet.getMetaData(); 
    int count = rsmd.getColumnCount(); 

    if (count == 1) { 
     psi.setCode(resultSet.getString("MY_CODE")); 
    } 
    else { 
     psi.setCode(resultSet.getString("MY_CODE")); 
     psi.setName(resultSet.getString("NAME")); 
    } 
} 
関連する問題