블로그 이미지
신세계 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)
Total187,706
Today5
Yesterday88


달력

« » 2017.05
  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 31      

공지사항

글 보관함


문제발생!!

아직 학생인 후배의 다급한 요청!!
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

 Eclipse에 Toad Extenseion for Eclipse를 설치하는건 별로 어렵지 않았다.
단지 ojdbc14.jar를 eclipse의 plugin 디렉토리에 위치 시키고, 설치 url(http://toaddownload.quest.com/toadextensions/eclipse/beta)로 이클립스의 Install new software로 등록후 설치만 하면 끝난다.
 설치 방법은 먼저 포스팅한 글을 보면 친절히 동영상으로 설명되어 있으니 참고하기 바란다.

 아직 TOAD for Ecipse는 베타 버젼이라서 그런지 다양한 기능은 제공 되지 않는다.


Toad Extention for Eclipse 설치후 화면
상단의 빨간 네모의 설명을 듣고 싶다면 아래 사이트를 방문하라.
http://blogs.inside.quest.com/teamfuze/tag/eclipse/

 상위에 있는 그림은 Toad Extention for Eclipse 의 공식 블로그에서 소개한 화면이다. 개인적으로 현재 작업중인 개발환경에서 설치해도 동일하게 나왔다.

먼저 설치후에 Toad Extention for Eclipse 를 사용하기 위해서는 이클립스의 Window > Open Perspective > Other 메뉴에서 Toad Extention for Eclipse 메뉴를 선택해야 우측 상단의 탭메뉴에 Toad Extention for Eclipse 가 표시되게 된다.

 현재 베타버젼에서는 쿼리 실행, 실행계획 확인, 프로시저 생성 수정,  DB정보등의 기본적은 거의 모든 기능을 사용 할 수 있다. 하지만 실제 TOAD와 같이 다양한 기능들은 사용 할 수 없다. 뭐. 내가 아는게 없으니 자세하게 소개 시켜 드릴순 없으나 개발자가 간단히 쿼리를 확인 하기 위해 TOAD를 실행시키는 일은 줄일 수 있을 듯 싶다. 지영옹.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd

  아침에 출근해서 이메일을 체크하고... 네이버 뉴스사파리를 하던중.. 눈에 띄는 글귀를 발견했다.


 "퀘스트 Toad, 자바 개발자 지원 강화 나서"



 평소에 TOAD 애용자로써..  퀘스트가 자바 개발자를 대거 채용하나... 궁금중에 혹시 클릭. 가장 먼저 눈에 들어온 단어.

"The Toad Extension for Eclipse"
"The Toad Extension for Eclipse"
"The Toad Extension for Eclipse!!!"

드디어 퀘스트가 Eclipse IDE에서 사용 가능한 TOAD를 내놓았다. 이전에 이미 Visual Studio용 TOAD를 내놓은 퀘스트는 이번에 자바개발자가 가장 많이 사용하는 VI에디터..아.. 아니. Eclipse용 TOAD를 내놓으므로써 자바 개발자에대한 지원을 강화하겠다라는 기사였다.

아. 빨리 설치해봐야지. 좋은 소식에 블로그 포스팅 먼저 해본다.  오전에 회의 끝나면 바로 설치설치;;
나보다 먼저 설치해 볼 사람은 아래 링크 클릭!!
설치 완료후 후기 올리겠음. 지영옹.

Toad Eextension for Eclipse Beta :  http://www.toadextensions.com/index.jspa?product=eclipse

Video Tutorials

  • Installing Toad Extension for Eclipse

이미지 클릭!!

저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd

CURSOR 란?

Database/Oracle / 2010.10.02 14:07

 
 CURSOR 란?

 오라클에서 CURSOR란 시스템 글로벌 영역의 공유 풀 내에 저장공간을 사용하여 사용자가 SQL 문을 실행시키면 결과값을 저장공간에 가지고 있다가 원하는 시기에 순차적으로 fetch해 처리하여 해당 결과 셋을 프로그래밍적으로 접근할수 있게 도와주는 기능이다.

 이해를 돕기위해 아래의 명시적 커서 예문을 보자.
 하단의 선언문(DECLARE)에서 SELECT한 결과값을 실행문(BEGIN)에서 FETCH 하여 한 결과값을 순차적으로 처리할 수 있다. 뭐 이해가 안가도 그냥 보자.


열심히 그렸다. 참견 말자.


CURSOR는 묵시적커서(Implicit Cursor)와 명시적커서(Explicit Curosr)로 나뉜다.



묵시적 커서 (Implicit Cursor)

 묵시적 커서는 각 SQL문장의 실행 결과에 접근하여 그 결과값을 이용하기 위한 내부적 커서이다. 간단히 변수를 이용한다고 생각해도 좋겠다. 일반적으로 SELECT문, 혹은 다른 속성에서 값을 얻어와 변수에 저장하는데 사용된다.

예문)
SELECT name
          into v_name
 FROM members
 WHERE student_no = 13;
 v_count = SQL%ROWCOUNT;

상단의 예문의 빨간 부분은 모두 묵시적 커서가 사용된 문장이다. 예문 내에는 커서가 선언된 부분이 없지만 v_name변수로 해당 SELECT문의 결과값이 (당연히 저 SELECT문의 결과는 1개여야 한다. 그 이상일 경우 에라.) 저장된다. 또 하단의 SQL%ROWCOUNT의 값이 v_count변수에 할당된다. 물론 SELECT문에서 나온 행수는 1개이므로 v_count에는 1이 들어간다.


묵시적 커서에서는 위에 사용된 SQL%ROWCOUNT와 같이 4가지 속성을 제공한다.

SQL%ROWCOUNT : 최근 실행된 SQL문의 결과 행 갯수를 리턴
SQL%FOUND : 최근에 실행된 SQL문의 결과 행 존재 유무, 결과값이 있을때 TRUE를 리턴.
SQL%NOTFOUND : SQL%FOUND와 반대
SQL%ISOPEN : 최근에 실행된 SQL문의 묵시적 커서의 종료 유무





명시적 커서 (Explicit Cursor)

 명시적 커서는 처음의 맨 상단의 예제와 같이 일반적으로 어떠한 결과값을 글로벌 영역에 저장해놓고 순차적으로 값을 Fetch해 이용하기 위해 사용된다. 명시적 커서라고 불리우는 이유는 묵시적 커서와는 다르게 명시적으로 CURSOR라고 선언하고 사용하기 때문에 누가봐도 커서니깐. 그렇게 불린다. 머. 아님말고.

 명시적 커서는 간단히 아래와 같이 4단계로 나뉜다.

 CURSOR :  커서 선언
 OPEN : 커서 열기
 FETCH ~ INTO : 커서가 가리키는 곳의 결과 값을 엑세스
 CLOSE : 커서 닫기


 다시 한번 상단의 그림으로 한단계씩 살펴보자.



1) DECLARE 
    CURSOR cursor_name IS 
    sql_statement;
커서를 선언하고 커서 선언문 내에 선언된 sql_statment를 실행하여 해당 결과값을 시스템 글로벌영역에 결과 값을 저장한다.



2) BEGIN
    OPEN cursor_name;
해당 커서 내음의 작업을 위해 커서 영역을 오픈한다.
이때 선언문에서 선언한 sql_statement를 실행해 해당 결과값을 구성한뒤 커서는 해당 결과값의 첫번째 행에 커서를 위치 시킨다.


3) FETCH cursor_name INTO variable1, variable2, ...;

cursor_name의 커서를 순차적으로 FETCH한다. 이때 cursor_name의 SELECT 문에 있는 컬럼 갯수와 variables의 갯수가 값아야 한다. 그 순서대로 variables에 값이 할당된다.



4) CLOSE cursor_name;

현재 오픈되어 있는 커서를 닫는다.



상단의 예에서 보듯이 CURSOR는 루프 문이 아니다. JAVA에서의 VECTOR등의 같이 결과값을 하나씩 순차적으로 FETCH할때만 사용된다. 적절히 사용하기 위해서는 LOOP문과 같이 사용하면 된다.




이상으로 간단하게 오라클의 CURSOR에 대하여 알아보았다. 많이 쓰이는 예이니 다들 꼭 기억해 두길 바란다. 지영옹.
저작자 표시 비영리 동일 조건 변경 허락
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 지영옹 FreeEnd

티스토리 툴바