proc 에서 break 에러문제 해결이요..
글쓴이: shean0 / 작성시간: 화, 2003/07/15 - 8:34오후
proc에서
break statement not within loop or switch
이런에러가 나오는데요?
이거 어떻게 해야 해결이 되죠... 지금까지는
make_24().. 이런 뭉치 함수의 소스 위치를 바꾸는 것으로 어떻게 해결했는데... 왜 이런 현상이 나오는 지 원인을 모르겠습니다.
어떤경우에 이런 것이 나오는 것인지?? 조언을 부탁드립니다.
아래는 제가 짠 함수 입니다.
내용은 이렇습니다 .
클라이언트가 phone_no,num이란것을 넘겨주면 이것을 가지고 지정된
디렉토리에 가서 삭제합니다.
만약 없다면, 없다고 메세지를 보내는것이죠..
만약 존재했다면 , 삭제하고, 현재 DB를 삭제했다고 업데이트 합니다. commit;
그리고 현재 DB내용을 다시 조회하여 알려주는 내용입니다...
이것을 각각 따로 함수로 구현해야 더 좋은가요?? 그래서 한 함수 내에서
select , CURSOR 를 함께 사용해서 나오는 현상인가??
이런에러는 어떤식으로 접근해야 하는지... 조언을 부탁드립니다.
dblib.c: In function `make_24': dblib.c:1516: break statement not within loop or switch dblib.c:1585: break statement not within loop or switch *** Error code 1
int make_24(char *table_index,char *num ,char *name,SERVER_HEADER_SEND *H_Send) { #ifdef EXEC SQL WHENEVER SQLERROR DO sql_error("make_24 Error"); int pos,pos_check; int ret; /* DB 연결 유무 */ FILE *bfp=NULL; /* 파일이 존재하는가 */ char tempdir[100]; /* file 찿는 경로 */ char command[110]; /* 파일 지우기 버퍼 */ int isexist=0; /* 존재하는가 유무 */ unsigned int data_len; /* 자신을 포함한 길이이다 */ const int DataDefaultLen=2+2+2+2;/* table_index[2]+Reserved[2]+result[2]+ret_count[2] */ const int DataPolyLen=2+2+20; /* num[2]+padding[2]+name[20] */ char F_table_index[2+1]; char F_reserved[2]; char F_result[2+1]; char F_ret_count[2+1]; int F_rtcount=0; EXEC SQL BEGIN DECLARE SECTION; char H_phone_no[12]; int H_inum; char H_num[2+1]; char H_padding[2]; char H_name[20]; int H_namelen; int H_G_CallCount; int H_now_count; EXEC SQL END DECLARE SECTION; memset(F_table_index,0x0,sizeof(F_table_index)); memset(F_reserved , 0x0,sizeof(F_reserved)); memset(F_result, 0x0,sizeof(F_result)); memset(F_ret_count, 0x0,sizeof(F_ret_count)); memset(H_num , 0x0,sizeof(H_num)); memset(H_padding , 0x0,sizeof(H_padding)); memset(H_name , 0x0,sizeof(H_name)); H_now_count=0; memset(command,0x0,sizeof(command)); memset(tempdir,0x0,sizeof(tempdir)); Sfprintf(MYFP,"make_24=====================>\n"); memcpy(H_phone_no,StrGlobal.phone_no,strlen(StrGlobal.phone_no)); memcpy(H_num,num,strlen(num)); /* find the file exist */ memcpy(tempdir,TEMP_PIC_DIR,strlen(TEMP_PIC_DIR)); strcat(tempdir,StrGlobal.phone_no); strcat(tempdir,".bmp"); printf(" tempdir[%s]\n",tempdir); bfp=fopen(tempdir,"wb"); if(bfp==NULL) { Dfprintf(MYFP," dir open fail[%s]\n",tempdir); isexist=0; /* 없다 */ } else { /* Delete file */ fclose(bfp); isexist=1; memcpy(command,"rm ",strlen("rm ")); strcat(command,tempdir); system(command); } if( (ret=DB_Connect()) != TRUE ) { H_Send->data_len=htonl(S_H_SEND_SIZE); /* 데이터 없이 자기 자신만 */ memcpy(H_Send->command,"24",2); H_Send->Reserved; memcpy(H_Send->result_code,"24",2); /* Error */ memcpy(H_Send->value_info,"00",2); /* 무료 */ return ERROR; } if( 1== isexist) { /* DB update to delete result */ EXEC SQL WHENEVER SQLERROR DO sql_error(" make_24 Delete Error"); EXEC SQL WHENEVER NOT FOUND DO break; Dfrpintf(" delete from M_KEEP where (phone_no=:H_phone_no[%s]) AND (num=:H_num[%s] )", H_phone_no,H_num); EXEC SQL delete from M_KEEP where (phone_no =:H_phone_no) AND ( num=:H_num ); EXEC SQL COMMIT WORK; EXEC SQL select count(*) INTO :H_now_count from M_KEEP where phone_no =:H_phone_no; } /* query again to send data at this time */ /* 현재 보관함에 삭제한 이후 존재하는 것을 조회 한다 */ pos=0; memcpy(&GlobalData[pos],table_index,2); pos +=2; /* reserved +=2 */ pos +=2; if( 1 == isexist) { memcpy(&GlobalData[pos],"RM",2); pos +=2; } else { memcpy(&GlobalData[pos],"FF",2); pos +=2; } pos_check=pos; pos +=2; /* ret_count 아래서 처리 */ F_rtcount=0; /* 갯수로 처리한다 */ EXEC SQL DECLARE make_24_Cursor CURSOR FOR SELECT phone_no,num,name, lengthb(name) FROM m_keep where phone_no = :H_phone_no order by num ; EXEC SQL OPEN make_24_Cursor; /* EXEC SQL WHENEVER NOT FOUND DO break; */ EXEC SQL WHENEVER NOT FOUND GOTO GoToNotFound; while( 1 ) /*( sqlca.sqlcode != 1403 ) */ { H_namelen=0; H_inum=0; memset(H_phone_no,0x0,sizeof(H_phone_no)); memset(H_name,0x0,sizeof(H_name)); memset(H_num , 0x0,sizeof(H_num)); memset(H_padding , 0x0,sizeof(H_padding)); memset(H_name , 0x0,sizeof(H_name)); EXEC SQL FETCH make_24_Cursor INTO :H_phone_no, :H_inum, :H_name ,H_namelen; F_rtcount++; DBfprintf(MYFP," count[%d] phone_no[%s] number[%d] name[%s][%d]\n", F_rtcount, H_phone_no, H_inum, H_name,H_namelen); /*sprintf(&GlobalData[pos],"%02d",H_inum); pos+=2;*/ /*my_itoa(H_number,&GlobalData[pos],2); pos+=2;*/ sprintf(H_num,"%02d",H_inum); memcpy(&GlobalData[pos],H_num,2); pos+=2; /* padding 2 bytes */ pos+=2; memcpy(&GlobalData[pos],H_phone_no,strlen(H_phone_no)); pos+=12; memcpy(&GlobalData[pos],H_name,H_namelen); pos+=20; if(F_rtcount< H_now_count)break; } EXEC SQL CLOSE make_24_Cursor; DB_Close(); sprintf(F_ret_count,"%02d",F_rtcount); memcpy(&GlobalData[pos_check],F_ret_count,2); printf(" Check poscheck[%d]:[%s]\n",pos_check,&GlobalData[pos_check]); data_len=S_H_SEND_SIZE+pos; H_Send->data_len=(data_len); memcpy(H_Send->command,"24",2); H_Send->Reserved; memcpy(H_Send->result_code,"00",2); memcpy(H_Send->value_info,"01",2); Dfprintf(MYFP," data_len[%d]=S_H_SEND_SIZE[%d]+pos\n", data_len,S_H_SEND_SIZE,pos); Sfprintf(MYFP,"make_24<=================================\n"); return TRUE; GoToNotFound: /* if(sqlca.sqlcode == 1403 ) */ { Dfprintf(MYFP," Data Not found \n"); EXEC SQL CLOSE make_24_Cursor; DB_Close(); data_len=S_H_SEND_SIZE; H_Send->data_len=(data_len); memcpy(H_Send->command,"24",2); H_Send->Reserved; memcpy(H_Send->result_code,"24",2); /* ERROR */ memcpy(H_Send->value_info,"00",2); /* 무료 */ Dfprintf(MYFP," data_len[%d]=S_H_SEND_SIZE[%d]\n", data_len,S_H_SEND_SIZE); memcpy(F_ret_count,"00",2); /* 현재 조회결과 없다. */ memcpy(&GlobalData[pos],F_ret_count,2); pos +=2; return TRUE; } #endif }
Forums:
정확한 기억인지 모르겠지만( 한 3~4년 전에 해본거라 ^^ )p
정확한 기억인지 모르겠지만( 한 3~4년 전에 해본거라 ^^ )
pro*c 에서 DO Break 의 경우 2가지 해결법이 있습니다.
첫번째는 , 예외 처리 같은 걸 해서 아, PRO*C 구문중에 그런게 있는데,
기억이 안나네요. -_-;;;(이런 돌대가리 T.T )
두번째는 루프를 이용하는 것입니다. 그냥 1이라도 루프를 돌리면
그 때 제대로 됬던 기억이 납니다. -_-;;; 틀린 해답이면, 그냥 틀렸다고
한마디만, ... 그럼 고운 하루되시길...
=========================
CharSyam ^^ --- 고운 하루
=========================
이해력의 한계가 느껴집니다.도대체 이 소스는 뭐하는 소스인가요?도
이해력의 한계가 느껴집니다.
도대체 이 소스는 뭐하는 소스인가요?
도저히 감잡을수 없음.......
누가 설명좀 해주세요.
하나도 모르겠어요...
전 pro*c를 많이 해보진 않았지만 .pc 화일 보다는 번역되어나온 .
전 pro*c를 많이 해보진 않았지만 .pc 화일 보다는 번역되어나온 .c 를 올려야 더 잘 알 수 있을 것 같습니다.
---
http://coolengineer.com
Re: proc 에서 break 에러문제 해결이요..
아마 지금쯤은 해답을 얻으셨으리라 짐작하지만 혹시 이 게시판을 보는 사람들이 궁금해 할지도 모르니 다시 한번 몇자 씁니다.
EXEC SQL WHENEVER NOT FOUND DO break ;
이거 때문입니다.
*.pc 를 *.c 로 변환하는 프로그램이 proc 인데 EXEC SQL 다음에 오는 문자들을 *.c 에 해당하는 코드로 변경하게 됩니다.
그런데 WHENEVER SQLERROR (혹은 WHENEVER NOTFOUND) 가 오면
SQL 에러가 났을때 어떻게 처리할지를 현재라인 이하부터 쭉 기억시킵니다.
EXEC SQL WHENEVER { SQLERROR | NOTFOUND } DO { subfunc() | break } ;
DO subfunc() 이면 에러났을때(또는 데이타 없을때 sqlca.sqlcode==1403) subfunc(); 를 *.c 에 쓰거나 break ; 를 *.c 에 쓰게 됩니다.
break; 문장은 *.c 에서 루프내에서만 정상적으로 컴파일 됩니다.
EXEC SQL WHENEVER SQLERROR CONTINUE ;
이렇게 CONTINUE 를 쓰면 이전에 기억한 에러처리 방법을 취소한다고 합니다.
(이 부분에 대해 아시는분 리플 요!)
또 하나, EXEC SQL WHENEVER SQLERROR GOTO label ; 하면 goto 문을 쓰게 됩니다.
아무튼 proc 가 *.pc 를 *.c 로 변환하기 위해서 EXEC SQL 다음 구문을 변환용 코드로 쓰는데 이때 SQL ERROR 나 1403 에러가 났을때 부를 함수(그저 문장자체임) 를 쓰다가 보니 break 가 부적당해서 나는 에러라고 보시면 됩니다.
내 자식들도 나처럼 !!
Re: proc 에서 break 에러문제 해결이요..
음.. 아직 해결은 못했구요..
위의 분이 말씀하신데로 .. 쓸데없는곳에 break가 걸려 있습니다.
그리고 원인은 설명하신 데로 일테구요.
음..문제는 이렇게 여러번 조회하는 경우 ..어떤식으로 처리해야 할지..샘플을 부탁드려도 될는지요..그냥 요약본만요..
지금 제가 하는 방식..이번에 시도할 방식입니다.
음... 죄송하지만 이런 예제가 없을까요??
이것두 분명 (처음에 c 배울 때처럼 ,지역변수,전역변수...영역이 생각나는데..)
영역으로 나누어졌을 텐데... 음
다시금 조언을 부탁드립니다.
언제나 즐프를 꿈꾸며~
Re: proc 에서 break 에러문제 해결이요..아직 이해 안되요.
에러가 나는 위치입니다.
말씀하신데로 .c에서 보면
이것이 나오는것으로 보아서는 위의 선언된 에러 처리부분과..
이전 여기 함수 전에 사용한 DB_procA { ~WHENEVER ~ do break; }
가 다음 함수 DB_procB()까지 영향을 주는것으로 보이는데요..이렇게 생각하면 안될것 같은데..이렇게 보여요..쩝.
짧게 요약한 소스입니다...
do break를 막았는데두....이러니..
if (sqlca.sqlcode == 1403) break;
if (sqlca.sqlcode < 0) sql_error(" make_24 Delete Error");
언제나 즐프를 꿈꾸며~
WHENEVER SCOPE문제..
저도 EXEC SQL WHENEVER NOT FOUND DO break; 쓰고 나서 나중에 c파일로 생성후에 ,
if (sqlca.sqlcode == 1403) break; 이런 코드가 자동으로 생성되어 문제를 앓앗었는데요..
이문제는 SCOPE 문제 입니다. WHENEVER는 Logical문제가 아니라 위치의 문제란 말이 있습니다...
EXEC SQL WHENEVER SQLERROR DO sql_error("Connect Error:");
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :db_host ;
EXEC SQL WHENEVER NOT FOUND DO break;
SELECT user_id,user_name,user_email FROM USER WHERE user_id=:user_id_name;
EXEC SQL OPEN c1;
while(1){
EXEC SQL FETCH c1 INTO :bbs_structs;
}
EXEC SQL CLOSE c1;
SELECT user_id,user_name,user_email FROM USER WHERE user_id=:user_id_name;
EXEC SQL OPEN c2;
while(1){
EXEC SQL FETCH c2 INTO :bbs_structs;
}
이런경우, DO break;문이 아래에까지 적용되어 생성된 c 소스상에 if (sqlca.sqlcode == 1403) break; 문이 포함될것 입니다....
물론 위의 문장이 모두 함수로 되어있어도 마찬가지 입니다....
그럼 수고요~
댓글 달기