Dev/DBMS
ORA-01002 fetch out of sequence
newtype
2008. 7. 11. 17:24
ORA-01002 fetch out of sequence 는 여러 경우에 발생을 한다.
그중 한가지에 대한 오류 발생 사례 이다.
DB Link로 Remote 테이블을 참조 하고 있는 프로세스가 작업을 수행하고 있는 상태에서,
Remote DB가 Shutdown 되는 경우 위 에러가 발생 한다.
Remote DB가 Start되고 새로운 세션을 맺어야 프로세스가 정상 동작을 한다.
세션을 유지한 상태에서 Remote DB가 Start 되어도 위 에러가 계속 발생한다.
말이 어렵다 테스트 해보자.
1. ORA TNS에 RemoteDB를 추가한다.
2. DB 링크를 생성한다.
CREATE PUBLIC DATABASE LINK test_link CONNECT TO remoteDBid IDENTIFIED BY remoteDBpwd USING 'remoteDB';
CREATE SYNONYM test_proc FOR test_proc_table@test_link
SELECT * FROM test_proc
CREATE SYNONYM test_proc FOR test_proc_table@test_link
SELECT * FROM test_proc
3. 데이터를 삽입한다.
insert into test_proc values ( 1, 1 );
insert into test_proc values ( 2, 1 );
~~~~~~
insert into test_proc values ( 33, 1 );
insert into test_proc values ( 44, 1 );
insert into test_proc values ( 2, 1 );
~~~~~~
insert into test_proc values ( 33, 1 );
insert into test_proc values ( 44, 1 );
4. 테스트 프로그램을 작성한다.
$ vi t.pc
$ proc iname=t.pc
$ cc -o t t.c -L/home/oracle/app/oracle/product/8.1.7/lib -lclntsh -R/home/oracle/app/oracle/product/8.1.7/lib
#include <stdio.h> EXEC SQL INCLUDE SQLCA; #define MAX_ARRAY_SIZE 10 int main() { int n; EXEC SQL BEGIN DECLARE SECTION; int hSEQ; char hOracleUser[20] = "localDBid"; char hOraclePwd[20] = "localDBpwd"; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT :hOracleUser IDENTIFIED BY :hOraclePwd; if(sqlca.sqlcode !=0) { printf( "login fail\n"); return 0; } for (n=0; n<10; n++) { printf( "start of job\n"); EXEC SQL DECLARE CUR_TEST_PROC CURSOR FOR SELECT SEQ FROM TEST_PROC; EXEC SQL OPEN CUR_TEST_PROC; while(1) { EXEC SQL FETCH CUR_TEST_PROC INTO :hSEQ; sleep(3); if(sqlca.sqlcode != 0) { if(sqlca.sqlcode == 1403) { printf( "data not found\n"); break; } else { printf( "fetch Error [%20s]\n" , sqlca.sqlerrm.sqlerrmc); break; } } printf("fetch [%d]\n", hSEQ ); } EXEC SQL CLOSE CUR_TEST_PROC; printf( "end of job\n"); } /* for */ return 0; }
$ proc iname=t.pc
$ cc -o t t.c -L/home/oracle/app/oracle/product/8.1.7/lib -lclntsh -R/home/oracle/app/oracle/product/8.1.7/lib
5. 프로세스 구동
start of job
6. Remote DB Shutdown
7. 에러 확인
fetch Error [ORA-01002: fetch out of sequence]
이거 원인을 파악하려고, 오늘 하루를 다 보냈다. ㅡ.ㅡ
참고
DB 링크 조회 쿼리
SELECT * FROM USER_DB_LINKS
시노님 조회 쿼리
SELECT * FROM TAB WHERE TABTYPE='SYNONYM'
반응형