proc 에서 break 에러문제 해결이요..

shean0의 이미지

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

}
charsyam의 이미지

정확한 기억인지 모르겠지만( 한 3~4년 전에 해본거라 ^^ )

pro*c 에서 DO Break 의 경우 2가지 해결법이 있습니다.

첫번째는 , 예외 처리 같은 걸 해서 아, PRO*C 구문중에 그런게 있는데,

기억이 안나네요. -_-;;;(이런 돌대가리 T.T )

두번째는 루프를 이용하는 것입니다. 그냥 1이라도 루프를 돌리면

그 때 제대로 됬던 기억이 납니다. -_-;;; 틀린 해답이면, 그냥 틀렸다고

한마디만, ... 그럼 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

익명 사용자의 이미지

이해력의 한계가 느껴집니다.
도대체 이 소스는 뭐하는 소스인가요?
도저히 감잡을수 없음.......
누가 설명좀 해주세요.
하나도 모르겠어요...

pynoos의 이미지

전 pro*c를 많이 해보진 않았지만 .pc 화일 보다는 번역되어나온 .c 를 올려야 더 잘 알 수 있을 것 같습니다.

xfmulder의 이미지

shean0 wrote:
proc에서
break statement not within loop or switch
이런에러가 나오는데요?
이거 어떻게 해야 해결이 되죠... 지금까지는
make_24().. 이런 뭉치 함수의 소스 위치를 바꾸는 것으로 어떻게 해결했는데... 왜 이런 현상이 나오는 지 원인을 모르겠습니다.

어떤경우에 이런 것이 나오는 것인지?? 조언을 부탁드립니다.

아마 지금쯤은 해답을 얻으셨으리라 짐작하지만 혹시 이 게시판을 보는 사람들이 궁금해 할지도 모르니 다시 한번 몇자 씁니다.

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 가 부적당해서 나는 에러라고 보시면 됩니다.

내 자식들도 나처럼 !!

shean0의 이미지

음.. 아직 해결은 못했구요..
위의 분이 말씀하신데로 .. 쓸데없는곳에 break가 걸려 있습니다.
그리고 원인은 설명하신 데로 일테구요.
음..문제는 이렇게 여러번 조회하는 경우 ..어떤식으로 처리해야 할지..샘플을 부탁드려도 될는지요..그냥 요약본만요..
지금 제가 하는 방식..이번에 시도할 방식입니다.

음... 죄송하지만 이런 예제가 없을까요??
이것두 분명 (처음에 c 배울 때처럼 ,지역변수,전역변수...영역이 생각나는데..)
영역으로 나누어졌을 텐데... 음
다시금 조언을 부탁드립니다.

DB_function()
{
    EXEC SQL BEGIN DECLARE SECTION;
    
    EXEC SQL END DECLARE SECTION;

     db_connect();    //연결 
     /goto 문과 select 
	EXEC SQL WHENEVER NOT FOUND GOTO search_fail;
	EXEC SQL SELECT count(DE_ID)
	         INTO :H_query_cnt
	         FROM ROTIS_NODE_0117
	         WHERE (X_LOC between  :X1 and :X2)
	                 and
	               (Y_LOC between :Y1 and :Y2)
	         ;
	EXEC SQL WHENEVER SQLERROR DO sql_error("body Error");

	EXEC SQL DECLARE my_cur1 CURSOR FOR
	SELECT DE_ID,X_LOC,Y_LOC,NODE_NAME,lengthb(NODE_NAME)
	FROM ROTIS_NODE_0117
	WHERE (X_LOC between  :X1 and :X2)
	    and
	   (Y_LOC between :Y1 and :Y2)
	  ;
	EXEC SQL OPEN my_cur1;
//==>여기부터는 do break죠.
	EXEC SQL WHENEVER NOT FOUND DO break; 
	
	for(;;)
	{
	//내부적으로 fetch하다가 없으면 break가 작동하도록 위에 선언 해 두었습니다.28라인
  	        EXEC SQL FETCH my_cur1 INTO :H_DE_ID ,:H_X_LOC,:H_Y_LOC,:H_NODE_NAME,:H_NAME_SIZE ;
                if(H_query_cnt < num_ret )
		{
			EXEC SQL CLOSE my_cur1;
			EXEC SQL COMMIT WORK RELEASE;
                        /* 임의의 결과를 추출해서 break; */
                        break;
		}
        }
	EXEC SQL CLOSE my_cur1;
	EXEC SQL COMMIT WORK RELEASE;
search_fail:
	if(sqlca.sqlcode<0)
	{
		EXEC SQL CLOSE my_cur1;
		EXEC SQL COMMIT WORK RELEASE;
		return -1;
	}
}

xfmulder wrote:
shean0 wrote:
proc에서
break statement not within loop or switch
이런에러가 나오는데요?
이거 어떻게 해야 해결이 되죠... 지금까지는
make_24().. 이런 뭉치 함수의 소스 위치를 바꾸는 것으로 어떻게 해결했는데... 왜 이런 현상이 나오는 지 원인을 모르겠습니다.

어떤경우에 이런 것이 나오는 것인지?? 조언을 부탁드립니다.

아마 지금쯤은 해답을 얻으셨으리라 짐작하지만 혹시 이 게시판을 보는 사람들이 궁금해 할지도 모르니 다시 한번 몇자 씁니다.

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 가 부적당해서 나는 에러라고 보시면 됩니다.

언제나 즐프를 꿈꾸며~

shean0의 이미지

에러가 나는 위치입니다.
말씀하신데로 .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");

DB_procB()
{
EXEC SQL WHENEVER SQLERROR DO sql_error("make_24 Error");
	EXEC SQL BEGIN DECLARE SECTION;	
	        char H_phone_no[12];
      	EXEC SQL END DECLARE SECTION;

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

shean0 wrote:
음.. 아직 해결은 못했구요..
위의 분이 말씀하신데로 .. 쓸데없는곳에 break가 걸려 있습니다.
그리고 원인은 설명하신 데로 일테구요.
음..문제는 이렇게 여러번 조회하는 경우 ..어떤식으로 처리해야 할지..샘플을 부탁드려도 될는지요..그냥 요약본만요..
지금 제가 하는 방식..이번에 시도할 방식입니다.

음... 죄송하지만 이런 예제가 없을까요??
이것두 분명 (처음에 c 배울 때처럼 ,지역변수,전역변수...영역이 생각나는데..)
영역으로 나누어졌을 텐데... 음
다시금 조언을 부탁드립니다.

DB_function()
{
    EXEC SQL BEGIN DECLARE SECTION;
    
    EXEC SQL END DECLARE SECTION;

     db_connect();    //연결 
     /goto 문과 select 
	EXEC SQL WHENEVER NOT FOUND GOTO search_fail;
	EXEC SQL SELECT count(DE_ID)
	         INTO :H_query_cnt
	         FROM ROTIS_NODE_0117
	         WHERE (X_LOC between  :X1 and :X2)
	                 and
	               (Y_LOC between :Y1 and :Y2)
	         ;
	EXEC SQL WHENEVER SQLERROR DO sql_error("body Error");

	EXEC SQL DECLARE my_cur1 CURSOR FOR
	SELECT DE_ID,X_LOC,Y_LOC,NODE_NAME,lengthb(NODE_NAME)
	FROM ROTIS_NODE_0117
	WHERE (X_LOC between  :X1 and :X2)
	    and
	   (Y_LOC between :Y1 and :Y2)
	  ;
	EXEC SQL OPEN my_cur1;
//==>여기부터는 do break죠.
	EXEC SQL WHENEVER NOT FOUND DO break; 
	
	for(;;)
	{
	//내부적으로 fetch하다가 없으면 break가 작동하도록 위에 선언 해 두었습니다.28라인
  	        EXEC SQL FETCH my_cur1 INTO :H_DE_ID ,:H_X_LOC,:H_Y_LOC,:H_NODE_NAME,:H_NAME_SIZE ;
                if(H_query_cnt < num_ret )
		{
			EXEC SQL CLOSE my_cur1;
			EXEC SQL COMMIT WORK RELEASE;
                        /* 임의의 결과를 추출해서 break; */
                        break;
		}
        }
	EXEC SQL CLOSE my_cur1;
	EXEC SQL COMMIT WORK RELEASE;
search_fail:
	if(sqlca.sqlcode<0)
	{
		EXEC SQL CLOSE my_cur1;
		EXEC SQL COMMIT WORK RELEASE;
		return -1;
	}
}

xfmulder wrote:
shean0 wrote:
proc에서
break statement not within loop or switch
이런에러가 나오는데요?
이거 어떻게 해야 해결이 되죠... 지금까지는
make_24().. 이런 뭉치 함수의 소스 위치를 바꾸는 것으로 어떻게 해결했는데... 왜 이런 현상이 나오는 지 원인을 모르겠습니다.

어떤경우에 이런 것이 나오는 것인지?? 조언을 부탁드립니다.

아마 지금쯤은 해답을 얻으셨으리라 짐작하지만 혹시 이 게시판을 보는 사람들이 궁금해 할지도 모르니 다시 한번 몇자 씁니다.

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 가 부적당해서 나는 에러라고 보시면 됩니다.

언제나 즐프를 꿈꾸며~

flazma의 이미지

저도 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; 문이 포함될것 입니다....

물론 위의 문장이 모두 함수로 되어있어도 마찬가지 입니다....

그럼 수고요~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.