블로그 이미지
신세계 SSG.COM / IT개발 1팀 / 상품개발담당 / 김지영 FreeEnd

카테고리

전체 (81)
끄적끄적 (13)
News (1)
Movie (11)
Security (1)
Design Patterns (2)
Operating System (4)
Database (8)
Framework (4)
Solution (7)
Language (1)
Web (4)
Lib (3)
TEST_Tools (4)
ETC... (7)
Software Factory (0)
Total189,821
Today3
Yesterday33


달력

« » 2017.06
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

공지사항

글 보관함

제 블로그에 싸이월드 공감 위젯을 적용하였습니다.

싸이월드의 공감 위젯은 페이스북의 "좋아요"나 믹시의 "믹시업"과 비슷한 기능을 합니다.
해당 공감을 클릭해 공감을 하게 되면 싸이월드 모아보기에 해당 내용이 올라가게되어 다른 사람과 해당 내용을 공유 할 수 있습니다.

다들 제 블로그의 공감을 마구 클릭해주세용. 지영옹.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd
TAG 공감


문제발생!!

아직 학생인 후배의 다급한 요청!!
DAO 를 만드는 중인듯한데.. 쿼리를 execute 시키면 에러가 난다는..

완전 초보시란다.
뭐 여튼.

다짜고짜 소스 먼저 보내줘서 대충 살펴 보았다.

쿼리도 잘 만들었고..
바인드도 잘 해줬구...

코드상 문제가 없는듯 했는데...

일단 에러 트래백을 먼저 보내달라고했다.



원인탐색

java.sql.SQLException: ORA-01008: 일부 변수가 바인드되지 않았습니다.

insert into member(pass_subno,s_no,sub_no)values(?,?,?)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at racle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1696)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1662)
at StatusDao.getPsub(StatusDao.java:59)
at Status.pdbSelect(Status.java:199)
at Status.mouseClicked(Status.java:213)
... 중략...


뭐 여튼 이런 에러였다.

에러가 나는 부분을 다시 보니..

String sql = "insert into member(pass_subno,s_no,sub_no)"
+ "values(?,?,?)";
try {
ps = con.prepareStatement(sql);
ps.setString(1, ps_no);
ps.setInt(2, s_no);
ps.setString(3, sub_no);
ps.execute(sql);
}catch
... 중략 ..


아하!

 PreparedStatement에 쿼리도 잘 넣어주고 변수를 잘 세팅 해서 넣어줬으면서, 쿼리 실행시에는 ?에 바인드를 하지 않은 sql을 넣어 execute 시켜버렸다.

그래서 친절하게 일부 변수가 바인드 되지 않았다고 에러를 출력했던 것이다.


해결
 ps.execute(sql); ps.executeUpdate(); 로 바꾸어서 해결!!


참고
 뭐 간단한 문법 실수이다. 초급 개발자라면 당연히 이런 문제를 겪을수 있지만 중급 이상의 개발자라면 이러시면 곤란하시죠. 푸훗.
 근데 왜 포스팅 하냐구? 갑자기 executeQuery()executeUpdate()랑 차이가 궁금해졌거든.

 저 둘의 차이는 리턴 타입을 보면 잘 알 수 있다.
다음은 해당 메소드의 javadoc의 내용이다.

ResultSet executeQuery() throws SQLException;
Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
return a ResultSet object that contains the data produced by the query; never null

int executeUpdate() throws SQLException;
Executes the SQL statement in this PreparedStatement object, which must be an SQL INSERT, UPDATE or DELETE statement; or an SQL statement that returns nothing, such as a DDL statement.
either (1) the row count for INSERT, UPDATE, or DELETE statements
or (2) 0 for SQL statements that return nothing


내용에서도 알수 있듯이 ..
executeQuery() 는 Query의 결과 오브젝트를 만들어 리턴을 해주고
executeUpdate() 는 Insert, Update, Delete등의 Query를 실행시키고 해당 결과의 row count를 리턴한다.

 INSERT, UPDATE, DELETE는 자칫 그냥 executeQuery() 로도 시행 시킬 수 있다.  하지만 정확한 데이터 처리를 위해 해당 알맞은 메소드 사용과 결과 처리를 한다면 더 나은 세상을 만드는데 기여 할 수 있을 것으로 기대 된당. 우후훗. 지영옹.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd
제 11회 2011 한국자바개발자 컨퍼런스
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd

티스토리 툴바