이전 포스팅에서 나온 오류를 해결 한 후, 계속해서 프로그램을 짜던 중
아래와 같은 에러코드를 다시한번 뱉습니다.
[ERROR] Insert Execute Failure! SQLCODE : -1001 ERROR MSG : ORA-01001: invalid cursor
오라클 공식문서에서도 뾰족한 해결방법도 안나와있고, 그냥 커서가 적합하지 않다라고만 되어있어서 많이 해멨습니다.
기존에 컴파일한 Makefile 방식과 에러가 나온 부분의 소스는 아래와 같았습니다.
TARGET = sh CC = gcc PROC = proc LIB = -L$(ORACLE_HOME)/lib -lclntsh -lpthread -ldl -lm -lrt -lodbc MYINC = include/ PROCINC = include=$(ORACLE_HOME)/precomp/public/ include=$(ORACLE_HOME)/rdbms/demo/ \ include=$(ORACLE_HOME)/rdbms/public/ \ include=$(ORACLE_HOME)/network/public/ CINC = -I$(ORACLE_HOME)/precomp/public/ -I$(ORACLE_HOME)/rdbms/demo/ \ -I$(ORACLE_HOME)/rdbms/public/ -I$(ORACLE_HOME)/network/public/ ORA_OPT = THREADS=YES PARSE=NONE MODE=ANSI CC_OPT = OBJECT = sh.o ORA_GARBAGE = *.dcl *.cod *.cud *.lis ######## implicit rules .SUFFIXES: .pc .c .pc.c: $(PROC) $(ORA_OPT) $(PROINC) INCLUDE=$(MYINC) $* .c.o: $(CC) -c -o $*.o $*.c -I $(MYINC) $(CINC) ####### build rules all: $(TARGET) $(TARGET): $(OBJECT) $(CC) -o $(TARGET) $(OBJECT) $(LIB) sh.c: sh.pc sh.o: sh.c clean: rm -f $(TARGET) $(TARGET).c $(OBJECT) $(ORA_GARBAGE)
memset(iQuery, 0x00, sizeof(iQuery)); sprintf(iQuery, "INSERT INTO ACCT_BALANCE VALUES (:sno, :sno, SYSDATE, SYSDATE, :sno, :sno, :sno, :sno, :sno, 'UPP', 'LOW', 'STT', SYSDATE, :sno, :sno, :sno, :sno, :sno, :sno, :sno )"); EXEC SQL AT :sAT PREPARE INSERT_STMT FROM :iQuery; 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, :sno; printf("[sno]=%d\n", sno); if (sqlca.sqlcode != 0) { PRINT_SQL_ERROR("[ERROR] Insert Execute Failure!"); return -1; } EXEC SQL AT :sAT COMMIT; }
오라클 문서를 찾아보니, ANSI 모드에서 CLOSE_ON_COMMIT 이 YES 가 기본값이며,
이 값의 의미를 찾아보니 COMMIT 이 수행될 때 열려있는 CURSOR 를 모두 닫는다고 나와있습니다.
더군다나 AUTOCOMMIT 을 OFF 로 할 수 있는 기능도 제공되지 않아, 저 옵션을 꼭 써줘야 한답니다.
( 이 부분, 혹시 Pro*C 에서 AUTOCOMMIT 을 OFF 할 수 있는 구문이 제공된다면 꼭좀 알려주세요. 꼭꼭 )
그래서 MakeFile 과 소스를 아래와 같이 수정한 후 위 에러를 해결하였습니다.
ORA_OPT 에 CLOSE_ON_COMMIT = NO 추가
TARGET = sh CC = gcc PROC = proc LIB = -L$(ORACLE_HOME)/lib -lclntsh -lpthread -ldl -lm -lrt -lodbc MYINC = include/ PROCINC = include=$(ORACLE_HOME)/precomp/public/ include=$(ORACLE_HOME)/rdbms/demo/ \ include=$(ORACLE_HOME)/rdbms/public/ \ include=$(ORACLE_HOME)/network/public/ CINC = -I$(ORACLE_HOME)/precomp/public/ -I$(ORACLE_HOME)/rdbms/demo/ \ -I$(ORACLE_HOME)/rdbms/public/ -I$(ORACLE_HOME)/network/public/ ORA_OPT = THREADS=YES PARSE=NONE MODE=ANSI CLOSE_ON_COMMIT=NO CC_OPT = OBJECT = sh.o ORA_GARBAGE = *.dcl *.cod *.cud *.lis ######## implicit rules .SUFFIXES: .pc .c .pc.c: $(PROC) $(ORA_OPT) $(PROINC) INCLUDE=$(MYINC) $* .c.o: $(CC) -c -o $*.o $*.c -I $(MYINC) $(CINC) ####### build rules all: $(TARGET) $(TARGET): $(OBJECT) $(CC) -o $(TARGET) $(OBJECT) $(LIB) sh.c: sh.pc sh.o: sh.c clean: rm -f $(TARGET) $(TARGET).c $(OBJECT) $(ORA_GARBAGE)
'Database > Oracle' 카테고리의 다른 글
[ORACLE] INS-35075: The specified SID is already in use 해결하기 (0) | 2018.08.07 |
---|---|
[ORACLE] ORA-65096: invalid common user or role name 해결하기 (0) | 2018.08.07 |
[ORACLE] SQL-02122: Invalid OPEN or PREPARE for this database connection 해결하기 (0) | 2018.07.27 |
[ORACLE] CONNECT BY 함수 사용하기 (0) | 2018.07.24 |
[ORACLE] SQL 의 자주쓰는 명령어 모음 (0) | 2018.07.24 |