proc에서..do break가 나오는 현상은 무엇때문이죠??
      글쓴이: shean0 / 작성시간: 금, 2003/01/24 - 10:15오전    
  
  왜 ..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로...하려구 하는데.. 원인을 모르겠네요..
Forums: 


제 생각인데...
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; }-> 이렇게 한번해보세요.
이렇게 해두 되네요...( 이제 procedure로 구현해 볼려구요..)
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"); }이렇게 짜두...괞찮은 것인지..돌아는 가는데..와..방금 그냥 해 본것인데...
님께서 말씀해주신것과..같네요...
그런데..말씀을 들으니...잘 아시는것 같은데..좋은 사이트 없나요..
이거 짤려구 하니..어디에서 문제가 생기는 것인지..고민해야 되는 부분이 너무 많아서요..더 공부를 해야 겠네요...
답변 감사드리며~~...
언제나 즐프를 꿈꾸며~
ProC 관련해서...
일단 제가 추천하는 싸이트는
otn.oracle.co.kr
가셔서 포럼방에 가보세요.
도움 될 만한 문서는 위에 싸이트 가셔서 ProC 문서 찾으시면
될껍니다. 한가지 아쉬운 점은 영어라 ㅡㅡ;
관련 도서는 영진.com 에서 나온 oracle bible Ver 8.x 2nd 에
기본적인 사항이 나와 있구요.
젤 좋은건 오라클에서 발간한 책입니다. ProC
근데 이건 구하기 어렵군요. 오라클 사야 되니까요.
아마 이책의 내용이 위에 싸이트에 있는 문서랑 똑같은 걸루 아는데 ㅡㅡ;
그럼 이만 (^^)(__)
댓글 달기