ORA-01002 fetch out of sequence


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

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 );

4. 테스트 프로그램을 작성한다.
$ vi t.pc
#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'