Pro*C 를 짜던 중 아래와 같은 에러코드를 자꾸 뱉습니다.
[ERROR] Insert Execute Failure! SQLCODE : -2122 ERROR MSG : SQL-02122: Invalid OPEN or PREPARE for this database connection
오라클 사이트에서 찾아보면, 아래처럼 해결하라고 나와있습니다.
Close the cursor to make it available for this connection or use a different cursor for this connection.
대충해석해보자면, 현재 세션이 사용하고 있는 커서를 닫거나, 다른 커서를 사용하세요. 라고 되어있습니다.
데이터베이스를 재구동 해봐도 마찬가지로 발생합니다.
SID 별 열려있는 커서를 확인하니 아래와 같이 나오네요.
SQL> SELECT sid, count(sid) "cursor" 2 FROM V$OPEN_CURSOR 3 GROUP BY sid; SID cursor --------------- --------------- 728 20 607 22 2422 9 2 42 2664 9 2059 9 2784 42 1212 67 849 20 486 10 1091 2 969 24 3 2 122 17 14 rows selected.
조금 황당한 실수였습니다. ( 실전에서는 실수 안먹히죠? ㅠㅠ )
기존 소스는 접속은 AT 절은 사용하고 EXECUTE 절에는 AT 이 없어서 발생한 문제였습니다.
EXEC SQL CONNECT :sUID IDENTIFIED BY :sPWD AT :sAT USING :sDSN;
for ( sno = start ; sno <= end ; sno ++ ) { EXEC SQL EXECUTE INSERT_STMT USING :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :s no; if (sqlca.sqlcode != 0) { PRINT_SQL_ERROR("[ERROR] Insert Execute Failure!"); return -1; } commit_check ++; if ( commit_check == interval ) { EXEC SQL AT :sAT COMMIT; if (sqlca.sqlcode != 0) { PRINT_SQL_ERROR("[ERROR] Insert Commit Failure!"); return -1; } commit_check = 0; } }
소스를 아래와 같이 변경한 뒤 해결되었습니다.
for ( sno = start ; sno <= end ; sno ++ ) { EXEC SQL AT :sAT EXECUTE INSERT_STMT USING :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :sno, :s no; if (sqlca.sqlcode != 0) { PRINT_SQL_ERROR("[ERROR] Insert Execute Failure!"); return -1; } commit_check ++; if ( commit_check == interval ) { EXEC SQL AT :sAT COMMIT; if (sqlca.sqlcode != 0) { PRINT_SQL_ERROR("[ERROR] Insert Commit Failure!"); return -1; } commit_check = 0; } }
'Database > Oracle' 카테고리의 다른 글
[ORACLE] ORA-65096: invalid common user or role name 해결하기 (0) | 2018.08.07 |
---|---|
[ORACLE] ORA-01001: invalid cursor 해결하기 (0) | 2018.08.02 |
[ORACLE] CONNECT BY 함수 사용하기 (0) | 2018.07.24 |
[ORACLE] SQL 의 자주쓰는 명령어 모음 (0) | 2018.07.24 |
[ORACLE] 컬럼의 데이터가 아래줄에 출력될 때, 데이터 출력 화면 조정하기 (0) | 2018.06.18 |