자바에서 사용하는 오라클 SQLException은 두 가지가 있다. 하나는 오라클 데이터베이스에서 발생하는 Exception이 있고 또 하나는 오라클에서 제공하는 JDBC 드라이버에 발생하는 JDBC Exection이 있다. 오라클 JDBC 에러는 모두 17로 시작하는 5자리 숫자다.
개발자들이 생각하기에 SQLException은 SQL에서만 발생한다고 믿고 있어서 아무리 SQL을 분석해봐도 에러는 없다. 자바 프로그램에서 SQL만 따로 떼어 수행할 때는 잘 되지만 프로그램 내부에서 호출할 때 17006 에러가 발생해도 계속 SQL만 분석해 보는 헛수고를 하게 된다.
import java.sql.*;
public class TestOracle {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String oracleDriver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@192.168.0.10:4101:ORADBA1";
String userid = "scott";
String userpw = "tiger";
Connection con = null;
try {
Class.forName(oracleDriver);
System.out.println("드라이버가 성공적으로 로드하였습니다.");
} catch(ClassNotFoundException e){e.printStackTrace();}
try {
con=DriverManager.getConnection(url,userid,userpw);
System.out.println("데이터베이스 연결 성공 ㅋㅋ");
String sql = "SELECT W.sid, W.sno, W.ino " +
"FROM 일용근로자근로내역확인서 W " +
"WHERE RCT_NO='120422011PAD10000001' " +
"AND SID LIKE ''||'%' " +
"order by reg_seq";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
System.out.println("컬럼 카운트 = " + numberOfColumns);
while (rs.next()) {
String sid= rs.getString("sid");
int sno= rs.getInt("sno");
String ino= rs.getString("ino "); <-- ino 다음 블랭크 삽입
System.out.println("SID = " + sid);
}
con.close();
} catch(SQLException e){System.out.println("errorcode = " + e.getErrorCode()); e.printStackTrace();}
}
}
드라이버가 성공적으로 로드하였습니다.
데이터베이스 연결 성공 ㅋㅋ
컬럼 카운트 = 3
errorcode = 17006
java.sql.SQLException: 부적합한 열 이름 <-- "Invalid column name"
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:286)
at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:4023)
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2647)
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1515)
at TestOracle.main(TestOracle.java:107) |
17006은 resultSet에서 getString(컬럼이름) 함수를 호출할 때 컬럼이름이 잘못 코딩되어 발생하는 설명 그대로 Invalid column name 이다. 컬럼명이 대문자든 소문자든 에러를 떨어뜨리지는 않는다. 예전에 oracle jdbc driver 9.x.x.x 가 잘못되어 발생하는 경우도 있었지만 현재 시점으로 14버전이기 때문에 드라이버 잘못도 아니다. Exception의 설명이 짧긴 하지만 설명한 대로다. 단지 SQL문장에 있는 것이 아니라 SQL문장을 핸들링하는 자바 코딩에 문제가 있었던 것이다.
원칙에 충실하자.