web-dev-qa-db-ja.com

次のOracleエラーの意味:無効な列インデックス

コードのテスト中に次のエラーが発生しました。

SQLException:無効な列インデックス

それはどういう意味ですか?

Oracleのすべてのエラーコードとステートメントを説明するオンラインドキュメントはありますか?

32
jdbcnewbie.

それがJavaによってスローされるSQLExceptionである場合、ResultSetから値を取得または設定しようとしているが、使用しているインデックスが範囲内にないためである可能性が最も高くなります。

たとえば、結果セットからインデックス3の列を取得しようとしている場合でも、SQLクエリから返される列は2つだけです。

48
Datajam

存在しない列をSELECTしようとしているようです。

おそらくあなたはORDER BY存在しない列?

SQLステートメントにタイプミスはありますか?

10
p.campbell

SpringのSimpleJdbcTemplateを使用して、これを実行しようとしたときに取得しました。

String sqlString = "select pwy_code from approver where university_id = '123'";
List<Map<String, Object>> rows = getSimpleJdbcTemplate().queryForList(sqlString, uniId);
  • SQLの疑問符に対応しないqueryForListの引数がありました。最初の行は次のとおりです。

    String sqlString = "select pwy_code from approver where university_id = ?";
    
7
Zoe

私もこのタイプのエラーを受け取りました、問題は次のようなステートメントへのパラメーターの使い方が間違っている、このようなクエリがあるとします

SELECT * FROM EMPLOYE E WHERE E.ID = ?

次のようなパラメータを設定した場合、preparedStatementオブジェクト(JDBC)に対して

preparedStatement.setXXX(1,value);
preparedStatement.setXXX(2,value)

その後、SQLException: Invalid column index

そのため、準備されたステートメントへの2番目のパラメーター設定を削除し、問題を解決しました

5
Naveen Kocherla

Spring Security 3.1.0を使用する場合、まったく同じ問題がありました。およびOracle 11G。次のクエリを使用して、無効な列インデックスエラーを取得していました。

<security:jdbc-user-service data-source-ref="dataSource"
                users-by-username-query="SELECT A.user_name AS username, A.password AS password FROM MB_REG_USER A where A.user_name=lower(?)"

クエリに「1 as enabled」を追加する必要があることがわかりました。

<security:jdbc-user-service data-source-ref="dataSource" users-by-username query="SELECT A.user_name AS username, A.password AS password, 1 as enabled FROM MB_REG_USER A where A.user_name=lower(?)"

その後はすべてうまくいきました。これはSpring JDBCコアパッケージのバグかもしれないと思う...

2
logixplayer

準備済みステートメントを使用してこの問題が発生しました。十分な「?」を追加しませんでした「VALUES」の場合、適切な量を追加するとEclipseがクラッシュし、それらの変更が失われました。しかし、p.campbellが示唆したようにSQLをくまなく調べ始めるまで、それはエラーではありませんでした。

1
eaglei22

最終的なSQLステートメントは次のようになります。

select col_1 from table_X where col_2 = 'abcd';

sQL IDEでこれを実行すると、すべてが問題ありません。

次に、このステートメントをJavaでビルドしようとします。

String queryString= "select col_1 from table_X where col_2 = '?';";
PreparedStatement stmt = con.prepareStatement(queryString);
stmt.setString(1, "abcd"); //raises Java.sql.SQLException: Invalid column index

SQLステートメント(データベースに対して実行された最初のステートメント)には、文字列値を囲む引用符が含まれ、セミカラムで終了しますが、PreparedStatementに渡す文字列には、ワイルドカード文字の周りに引用符が含まれてはいけませんか?セミカラム。

白い背景に表示される文字を削除しました

"select col_1 from table_X where col_2 = '? ';";

入手する

"select col_1 from table_X where col_2 = ?";

(私はここで解決策を見つけました: https://coderanch.com/t/424689/databases/Java-sql-SQLException-Invalid-column

0
Newton fan 01

準備済みステートメントを動的に作成する1つのレガシーアプリケーションでこの問題が発生しました。

String firstName;
StringBuilder query =new StringBuilder("select id, name from employee where country_Code=1");
query.append("and  name like '");
query.append(firstName + "' ");
query.append("and ssn=?");
PreparedStatement preparedStatement =new prepareStatement(query.toString());

ssnの値を設定しようとすると、無効な列インデックスエラーが発生し、最終的には 'Name内にfirstNameがあることが原因であることがわかりました。それは構文を乱します。

0
zelalem fikre