proc에서..do break가 나오는 현상은 무엇때문이죠??

shean0의 이미지

왜 ..break.에러가 나는지 .....
프로시져에서두 do break.에러가 나오고... 간단한 이것에서두..나오는데..

똑같은 소스를 다른데서 돌리면 되는데....

"test.pc" 90 행, 1855 문자 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <math.h>
#define TRUE           1
#define FALSE          0

#define NAME_LENGTH    10
#define ARRAY_LENGTH   10
char *username;
char *password;

void sql_error(char *msg) ;
int  db_connect();
void db_close();
int matching_name_index();

int main()
{
   matching_name_index();
}

void sql_error(char *msg)
{
    printf("\ni==first %s", msg);
    printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc);

    exec SQL WHENEVER SQLERROR CONTINUE;

    printf("\n==second %s", msg);
    printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc);

    EXEC SQL ROLLBACK WORK RELEASE;
    exit(EXIT_FAILURE);
}

int  db_connect()
{
   username="sean";
   password ="sean_ocl";

   EXEC SQL WHENEVER SQLERROR DO sql_error("connect oracle Error\n");
   EXEC SQL CONNECT :username IDENTIFIED BY :password;
   printf("\n Connected to ORACLE as user: %s\n", username);
   return 1;
}

void db_close()
{
   EXEC SQL WHENEVER SQLERROR DO sql_error("close error");
   EXEC SQL COMMIT WORK RELEASE;
}
int matching_name_index()
{
    int ret;
    EXEC SQL BEGIN DECLARE SECTION;
       int H_DE_ID;
       int H_NAME_LEN;
       char H_NODE_NAME[30];
    EXEC SQL END DECLARE SECTION;

    ret=db_connect();
    printf("============>ret db_connect[%d]\n",ret);
    H_DE_ID=100;
    printf("H_DE_ID=[%d]",H_DE_ID);

    /*==>EXEC SQL WHENEVER NOT FOUND DO break; */
    EXEC SQL SELECT de_id,node_name,lengthb(node_name)
             INTO   :H_DE_ID,:H_NODE_NAME,:H_NAME_LEN
             FROM   rotis_node_0117
             WHERE  de_id =:H_DE_ID;
    if (sqlca.sqlcode == 1403) {
        printf("sqlerror 1403\n");
        db_close();
    }
    if (sqlca.sqlcode < 0) {
        printf("sqlerror 0 \n");
        db_close();
    }
    else
       db_close();
    printf("H_DE[%d][%s][%d]\n",H_DE_ID,H_NODE_NAME,H_NAME_LEN);
    return 1;
}

이렇게 실행하면..
Connected to ORACLE as user: sean
============>ret db_connect[1]
H_DE_ID=[100]H_DE[100][수유사거리동단               ][14]

이런 결과가 나오는데요.. 이것을 본래 작업중이던 곳에 집어 넣으면..

==> 여기에

EXEC SQL WHENEVER NOT FOUND DO break; 이렇게 넣어두.넣지 않아두...
myproc.c: In function `matching_name_index':
myproc.c:980: break statement not within loop or switch
*** Error code 1
이럴때는 어떻게 해야하죠??? 이거 2일째 날새는 건데...

원래는 procedure로 짯었는데..안되어서..cursor 말구..그냥 단순 select로...하려구 하는데.. 원인을 모르겠네요..

neomagic의 이미지

EXEC SQL WHENEVER NOT FOUND DO break;

위에꺼는 루프문이나 커서에서만 써야 할듯 싶네요...

두 가지 방법이 있을듯 싶네요. 저두 프로씨 초보라...
1, 2번 방법이 있는데 2번째 방법이 좋을듯 싶네요.

1. EXEC SQL WHENEVER NOT FOUND STOP;

STOP -> 프로그램 수행을 종료하고 COMMIT되지 않은 작없을 롤백시킨다.

2. EXEC SQL WHENEVER NOT FOUND GOTO label_name;

.
.
. 
     EXEC SQL WHENEVER NOT FOUND GOTO LABEL_NOT_FOUND;

     EXEC SQL SELECT de_id,node_name,lengthb(node_name) 
             INTO   :H_DE_ID,:H_NODE_NAME,:H_NAME_LEN 
             FROM   rotis_node_0117 
             WHERE  de_id =:H_DE_ID;
.
.
.
    printf("H_DE[%d][%s][%d]\n",H_DE_ID,H_NODE_NAME,H_NAME_LEN);
     return 1;

LABEL_NOT_FOUND :
     db_close();
     return 1;
}
 

-> 이렇게 한번해보세요.

shean0의 이미지

 int matching_name_index()
{
    int ret,i;
    EXEC SQL BEGIN DECLARE SECTION;
       int H_DE_ID;
       int H_NAME_LEN;
       char H_NODE_NAME[30];
    EXEC SQL END DECLARE SECTION;

    ret=db_connect();
    printf("============>ret db_connect[%d]\n",ret);

    printf("H_DE_ID=[%d]",H_DE_ID);
    for(i=0;i<3;i++)
    {
      if(i==0) H_DE_ID=100;
      if(i==1) H_DE_ID=200;
      if(i==2) H_DE_ID=300;
      EXEC SQL WHENEVER NOT FOUND do break;  
      EXEC SQL SELECT de_id,node_name,lengthb(node_name)
             INTO   :H_DE_ID,:H_NODE_NAME,:H_NAME_LEN
             FROM   rotis_node_0117
             WHERE  de_id =:H_DE_ID;
      if (sqlca.sqlcode == 1403) {
        printf("sqlerror 1403\n");
        db_close();
         
      }
      if (sqlca.sqlcode < 0) {
        printf("sqlerror 0 \n");
        db_close();
      }
      printf("H_DE[%d][%s][%d]\n",H_DE_ID,H_NODE_NAME,H_NAME_LEN);
   }
   if(i!=3){ printf("다 못O았다\n");db_close();}
   else printf("all\n");
}
이렇게 짜두...&#44318;찮은 것인지..돌아는 가는데..
============>ret db_connect[1]
H_DE_ID=[2010]H_DE[100][수유사거리동단               ][14]
H_DE[200][코리아웨딩홀                 ][12]
H_DE[300][은평구신사동사거리           ][18]
all
와..방금 그냥 해 본것인데...
님께서 말씀해주신것과..같네요...

그런데..말씀을 들으니...잘 아시는것 같은데..좋은 사이트 없나요..
이거 짤려구 하니..어디에서 문제가 생기는 것인지..고민해야 되는 부분이 너무 많아서요..더 공부를 해야 겠네요...

답변 감사드리며~~...

언제나 즐프를 꿈꾸며~

neomagic의 이미지

일단 제가 추천하는 싸이트는
otn.oracle.co.kr
가셔서 포럼방에 가보세요.

도움 될 만한 문서는 위에 싸이트 가셔서 ProC 문서 찾으시면
될껍니다. 한가지 아쉬운 점은 영어라 ㅡㅡ;

관련 도서는 영진.com 에서 나온 oracle bible Ver 8.x 2nd 에
기본적인 사항이 나와 있구요.

젤 좋은건 오라클에서 발간한 책입니다. ProC
근데 이건 구하기 어렵군요. 오라클 사야 되니까요.
아마 이책의 내용이 위에 싸이트에 있는 문서랑 똑같은 걸루 아는데 ㅡㅡ;

그럼 이만 (^^)(__)