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'
반응형