오늘은 proc에서 자주 발생하는 error메시지에 대해서 알아보도록 하겠습니다.
1)
ORACLE Error detected:<BR>
SQL-02108: Invalid descriptor passed to run-time library <BR>
위와 같은 에러메시지가 난 경우에는 100% 다음과 같은 실수를 했을 경우에 나타난다.
sprintf(sqlstmt.arr," select S_NAME , S_AGE , S_SEX , S_ADDRESS , S_TELEPHONE , to_char(S_DATE, 'yy/mm/dd') , S_MEMO, S_ID "
" from s_reg_db "
" order by S_DATE ");
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
위의 문장을 잘 살펴보면 sqlstmt.arr에 query를 입력한 후 곧바로 커서를 지정하였다. 이렇게 되면 문제가 발생할 수 있다. 왜냐하면
sqlstmt.len을 지정해 주지 않았기 때문이다.
다음의 문장을 추가하면 에러가 나지 않는다.
sprintf(sqlstmt.arr," select S_NAME , S_AGE , S_SEX , S_ADDRESS , S_TELEPHONE , to_char(S_DATE, 'yy/mm/dd') , S_MEMO, S_ID "
" from s_reg_db "
" order by S_DATE ");
sqlstmt.len = strlen( (char *)sqlstmt.arr);
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
2) 결과 데이터가 깨져서 나타나는 경우
: 이런 경우에는 memset을 하지 않았기 때문이다. 데이터를 변수에 입력하기 전에 memset을 해주면 문제는 해결된다.
3) 결과 데이터가 모자랄 경우
: fetch할때 파라메터를 적게 줄경우에 나타난다. fetch할 때의 파라메터 개수를 잘 세어보면 문제를 해결할 수 있다.
4)
ORACLE Error detected:
ORA-00904: invalid column name
위와 같은 에러메시지가 나타나는 경우에는 query문에서 column명을 틀리게 주었기 때문이다. 그러므로 column명을 수정해 주면 문제는 해결된다.
5)
ORACLE Error detected:
SQL-02112: SELECT..INTO returns too many rows
위와 같은 에러메시지가 나타난 경우에는 query한 결과가 1개 이상일 때 cursor를 사용하지 않았을 때 생기는 것이다. 다음의 예제를 보면 원인을
쉽게 알 수 있다.
1번 : sprintf(sqlstmt.arr,"select s_name from s_reg_db");
sqlstmt.len = strlen( (char *)sqlstmt.arr);
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
2번 : EXEC SQL select s_name into :re1 from s_reg_db;
1번의 경우에는 에러가 나지 않지만 2번의 경우에는 에러가 난다. 왜냐하면 s_reg_db라는 곳에 s_name column에 해당하는 row가 1개 이상이기 때문이다.
만약 리턴되는 row가 1개라면 2번문장도 문제가 없을 것이다. 결국 1번 같은 경우에는 return되는 row가 많을 경우 1개씩 받아서 fetch하여 처리할 때
사용하는 것이고 2번의 경우에는 리턴되는 row가 1개일 경우에 사용하는 것이다.
ex) EXEC SQL select count(*) from s_reg_db;
EXEC SQL select s_name into :re1 from s_reg_db where id = 1;
1)
ORACLE Error detected:<BR>
SQL-02108: Invalid descriptor passed to run-time library <BR>
위와 같은 에러메시지가 난 경우에는 100% 다음과 같은 실수를 했을 경우에 나타난다.
sprintf(sqlstmt.arr," select S_NAME , S_AGE , S_SEX , S_ADDRESS , S_TELEPHONE , to_char(S_DATE, 'yy/mm/dd') , S_MEMO, S_ID "
" from s_reg_db "
" order by S_DATE ");
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
위의 문장을 잘 살펴보면 sqlstmt.arr에 query를 입력한 후 곧바로 커서를 지정하였다. 이렇게 되면 문제가 발생할 수 있다. 왜냐하면
sqlstmt.len을 지정해 주지 않았기 때문이다.
다음의 문장을 추가하면 에러가 나지 않는다.
sprintf(sqlstmt.arr," select S_NAME , S_AGE , S_SEX , S_ADDRESS , S_TELEPHONE , to_char(S_DATE, 'yy/mm/dd') , S_MEMO, S_ID "
" from s_reg_db "
" order by S_DATE ");
sqlstmt.len = strlen( (char *)sqlstmt.arr);
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
2) 결과 데이터가 깨져서 나타나는 경우
: 이런 경우에는 memset을 하지 않았기 때문이다. 데이터를 변수에 입력하기 전에 memset을 해주면 문제는 해결된다.
3) 결과 데이터가 모자랄 경우
: fetch할때 파라메터를 적게 줄경우에 나타난다. fetch할 때의 파라메터 개수를 잘 세어보면 문제를 해결할 수 있다.
4)
ORACLE Error detected:
ORA-00904: invalid column name
위와 같은 에러메시지가 나타나는 경우에는 query문에서 column명을 틀리게 주었기 때문이다. 그러므로 column명을 수정해 주면 문제는 해결된다.
5)
ORACLE Error detected:
SQL-02112: SELECT..INTO returns too many rows
위와 같은 에러메시지가 나타난 경우에는 query한 결과가 1개 이상일 때 cursor를 사용하지 않았을 때 생기는 것이다. 다음의 예제를 보면 원인을
쉽게 알 수 있다.
1번 : sprintf(sqlstmt.arr,"select s_name from s_reg_db");
sqlstmt.len = strlen( (char *)sqlstmt.arr);
EXEC SQL PREPARE s_reg_result FROM :sqlstmt;
EXEC SQL DECLARE reg_cursor CURSOR for s_reg_result;
EXEC SQL OPEN reg_cursor;
2번 : EXEC SQL select s_name into :re1 from s_reg_db;
1번의 경우에는 에러가 나지 않지만 2번의 경우에는 에러가 난다. 왜냐하면 s_reg_db라는 곳에 s_name column에 해당하는 row가 1개 이상이기 때문이다.
만약 리턴되는 row가 1개라면 2번문장도 문제가 없을 것이다. 결국 1번 같은 경우에는 return되는 row가 많을 경우 1개씩 받아서 fetch하여 처리할 때
사용하는 것이고 2번의 경우에는 리턴되는 row가 1개일 경우에 사용하는 것이다.
ex) EXEC SQL select count(*) from s_reg_db;
EXEC SQL select s_name into :re1 from s_reg_db where id = 1;
기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 1983 | ||
[채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1453 | ||
53 | [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… | 03-15 | 1207 | |
52 | [주말주간]C#, ASP.NET마스터 | 01-31 | 1372 | |
51 | [평일,기업100%환급]SQL기초에서 Schema Object까지 | 01-31 | 1199 | |
50 | [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 | 01-31 | 1063 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 | 01-19 | 1371 | |
48 | [평일주간,평일야간,주말]안드로이드개발자과정 | 01-11 | 1204 | |
47 | [평일야간,주말주간]JAVA,Network&JSP&Spring,MyBatis,Hibernate | 01-03 | 1706 | |
46 | 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… | 12-27 | 1983 | |
45 | [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… | 12-19 | 1474 | |
44 | 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) | 12-14 | 1436 | |
43 | [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… | 12-11 | 1453 | |
42 | [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 | 12-09 | 1168 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1375 | |
40 | [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… | 12-01 | 1532 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1031 |
댓글 없음:
댓글 쓰기