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;


- 출저 oraclejava -

Posted by pino93
TAG