ResultSet 부적합한 열 이름 - ResultSet bujeoghabhan yeol ileum

java.sql.SQLException: 부적합한 열 이름

==> 쿼리결과에 받는값이 잘못됐을시..(DAO 확인)
      받는값이 2개인데..쿼리문에서 1개만 넘겨줄때

Post navigation

value 와 value.length check 시 실수하기쉬운것 form 전송이 제대로 되지 않거나, form 객체를 제대로 인식 못할 때 (찾지 못할 때)


이번에 PIVOT 이라는 좋은 함수를 알게 되어 사용하고 있어요.
그런데, 이상하게도 어떤자료는 정상적으로 잘 나오는데..
어떤 자료는 '부적합한 열 이름' 이라는  오류가 발생하고 있어요.

같은 SQL 문장인데도 그러네요.
아래 문장에서  'COMMISN_RT2' 라는 컬럼은 없는데  계속 COMMISN_RT2를 찾고 있어요.
문제는 Orange또는 Toad에서는 잘 되는데   전자정부프레임웍을 사용하는데.. 이때 실행하면

--- Check the result mapping for the 'COMMISN_RT2' property. 
--- Cause: java.sql.SQLException: 부적합한 열 이름

이렇게 나오네요.

SQL문제가 아니여서 이곳에 질문을 해야 될지 모르겠지만.. 어디 도움을 청할때가 없어서...
혹시 이런 경험 있으신분 부탁 합니다.

SELECT *
FROM (
    SELECT A.COMP_CD,
  A.PLAN_ID,
  A.SEASN_SEQ,
  A.CLASS_CD,
  A.SHOP_CD,
  V.SHOP_NM,
  A.PLAN_YM,
  A.COMMISN_RT
    FROM TBP_COMMISSION_L A ,
  TBP_SEASNTERM_L B ,
  VSE_SHOP_INFO V
    WHERE A.COMP_CD = B.COMP_CD
  AND A.PLAN_ID = B.PLAN_ID
  AND A.SEASN_SEQ = B.SEASN_SEQ
  AND B.COMP_CD = V.COMP_CD
  AND B.BRAND_CD = V.BRAND_CD
  AND A.SHOP_CD = V.SHOP_CD
  AND A.COMP_CD = '01'
  AND A.PLAN_ID = '11'
  AND A.SEASN_SEQ = '1' ) PIVOT ( SUM(COMMISN_RT) FOR PLAN_YM IN ( '201311' AS COMMISN_RT0,
  '201312' AS COMMISN_RT1 ) )
ORDER BY SHOP_CD, CLASS_CD

자바에서 사용하는 오라클 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문장을 핸들링하는 자바 코딩에 문제가 있었던 것이다.

원칙에 충실하자.