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
근데 이건 구하기 어렵군요. 오라클 사야 되니까요.
아마 이책의 내용이 위에 싸이트에 있는 문서랑 똑같은 걸루 아는데 ㅡㅡ;

그럼 이만 (^^)(__)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.