任何人都可以建议我在这里做错了什么,尝试在控制台中打印SQL查询输出,但错误为“ java.sql.SQLException:无效的列索引”。
import java.io.*;
import java.sql.*;
public class RetrieveFile {
public static void main(String args[]) throws Exception {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@123.43.23.43:8080/orcl", "Test", "*****");
PreparedStatement ps = con.prepareStatement("select * from MSG where MSD='1234'");
ResultSet rs = ps.executeQuery();
// rs.next();//now on 1st row
while (rs.next()) {
int numberOfColumns = 0;
for (int column = 1; column >= numberOfColumns; column++) {
if (column > 1)
System.out.print(", ");
System.out.print(rs.getString(column));
}
}
con.close();
// System.out.println("success" + (rs.getString(1)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
我得到了部分响应,但最终收到以下错误。
错误:
null,1234、389,OUR,NOW,USD,0、0,FR1,wert,USD,0,null,0、0,null,DR,null,null,0、0,null,null,null,null, null,null,null,null,null,0、2、2019-06-11 00:00:00.0,null,null,null,null,null,null,null,java.sql.SQLException:oracle的无效列索引.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) RetrieveFile.main(RetrieveFile.java:20)处的oracle.jdbc.driver.OracleResultSetImpl.getString(OracleResultSetImpl.java:379)拾取JAVA_TOOL_OPTIONS:-Duser.home = C:\ Users \ 45060849
请在输出中包括味精的表结构。
如果您既不知道列数也不知道其数据类型,则必须通过进行检查ResultSetMetaData
。
下面的示例使用单独的方法执行此操作,该方法尚未考虑所有可能的SQL数据类型,但考虑了一些非常常见的数据类型。
public static void main(String args[]) throws Exception {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@123.43.23.43:8080/orcl", "Test", "*****");
PreparedStatement ps = con.prepareStatement("select * from MSG where MSD='1234'");
ResultSet rs = ps.executeQuery();
try {
printResultColumns(rs);
} catch (SQLException e) {
System.err.println(e.getMessage());
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
您基本上可以请求列数,将其用作迭代边界,然后可以检查column的类型i
。由于用于不同数据类型的方法不同,因此需要这样做。
public static void printResultColumns(ResultSet resultSet) throws SQLException {
ResultSetMetaData rsmd = resultSet.getMetaData();
int columnCount = rsmd.getColumnCount();
while (resultSet.next()) {
// you get a single result row in here, not the entire ResultSet
for (int i = 1; i <= columnCount; i++) {
switch (rsmd.getColumnType(i)) {
case Types.VARCHAR:
case Types.LONGVARCHAR:
case Types.CHAR:
System.out.println(resultSet.getString(i));
break;
case Types.DOUBLE:
System.out.println(resultSet.getDouble(i));
break;
case Types.INTEGER:
System.out.println(resultSet.getInt(i));
break;
case Types.DATE:
System.out.println(resultSet.getDate(i).toString());
break;
case Types.TIMESTAMP:
System.out.println(resultSet.getTimestamp(i).toString());
break;
case Types.BOOLEAN:
System.out.println(resultSet.getBoolean(i));
break;
case Types.DECIMAL:
case Types.NUMERIC:
System.out.println(resultSet.getBigDecimal(i));
break;
default:
System.out.println("This column type ("
+ rsmd.getColumnTypeName(i)
+ ") is currently not supported in method \"printResultColumns\""
+ ".\nAdd it as case there.");
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句