ORA-00911: invalid character [proc 에서..에러]

shean0의 이미지

이런 메세지가 왜 ...나오는지..도저히..소스를 봐도..
알수가없네요..

안녕하세요..지금 proc로 프로그램을 작성중인데요..
아래와 같은 에러때문에...이것이 일어나는 이유가 무엇인지..모르겠습니다.

Connected to ORACLE as user: sean //연결성공시 로그
search_name_node Error // whenever sqlerror 시 분기 함수
로그...
ORA-00911: invalid character // 그때의 내용입니다.
어떨때..이런 에러가 뜨는지...??
DB table struct 는
{
de_id number(4);
node_name varchar2(30);
....
}
입니다...
아래에서..주석으로 한 부분이 문제가 되는 부분같은데..어덯게 바꾸어야
할지...

>int search_name_node(char *buf,int count_name)
>{
>
> char what;
> int num_ret;
> EXEC SQL BEGIN DECLARE SECTION;
> int H_query_cnt;
> int H_DE_ID;
> int H_NAME_SIZE;
> char H_NODE_NAME[31];
> char Sqlcmd[100]; /* 질문1:여기에 table구조대로 모든
변수를 셋팅해야 하나요?*/
> EXEC SQL END DECLARE SECTION;
>
> memset(tmp_buf,0x0,sizeof(tmp_buf));
> memset(Sqlcmd,0x0,sizeof(Sqlcmd));
> memcpy(tmp_buf,"11",2);
> sprintf(Sqlcmd,"%s","Select de_id,node_name from rotis_node_0117 where
de_id in ( 4001, 500 ,9999,5000) order by de_id;");
> /*<=======여기서 임의의 query스트링을 만들어서 (예를 들면
9999,1111,2222 이런 de_id 가 생성되는 로직이 들어갑니다....===>*/
> printf("Sqlcmd[%s]\n",Sqlcmd);
> what=0x03; /* Rotis query result를 만든다. */
> num_ret=0;
>
> db_connect();
>
>/* #ifdef IDONTKNOW <=======*/
> EXEC SQL WHENEVER SQLERROR DO sql_error("search_name_node Error \n");
> EXEC SQL PREPARE my_cur3 FROM :Sqlcmd;
> EXEC SQL DECLARE MY_STM1 CURSOR FOR my_cur3;
> EXEC SQL OPEN MY_STM1;
> while(1)
> {
> EXEC SQL FETCH MY_STM1 INTO :H_DE_ID,:H_NODE_NAME;
> printf("[%04d]", H_DE_ID);
> printf("[%s]", H_NODE_NAME);
> printf("\n");
> }
> EXEC SQL CLOSE MY_STM1 ; /**질문2: 이게 맞는가요? 이렇게 바꾸었더니
컴파일 되네요...<===my_cur3; **/
> EXEC SQL COMMIT WORK RELEASE;
>/* #endif **/
printf("ending==");
>}

낙엽의 이미지

pro*c에서 //의 주석은 통하지 않습니다.
모든 주석은 /* */로만 가능합니다.
물론 c에서와 같이 주석안에 주석은 허용되지 않습니다.

shean0의 이미지

Connected to ORACLE as user: sean //연결성공시 로그
search_name_node Error // whenever sqlerror 시 분기 함수
로그...
ORA-00911: invalid character // 그때의 내용입니다.

아 .. 이것은 왼쪽이 실제 프로그램 돌았을때 로그(printf)구요..그냥 옆에다가 //해서 주석처럼 달은것 뿐입니다.

분명이..무엇이 틀린것일텐데..컴파일시에는 아무 이상이 없다고 나오거든요...
런 타임에서나오는데...이거 왜그런지...

언제나 즐프를 꿈꾸며~

choissi의 이미지

아래는 00911 이 발생했을때의 쿼리문입니다.

ORA-00911: invalid character
Query :"SELECT * FROM (SELECT T.*,rownum AS rnum FROM (SELECT * FROM hj WHERE h_title BETWEEN '移? AND '?? ) T ORDER BY T.h_num DESC)"

보시는거 처럼 문자가 이상한 값들어가면 발생하는 에러 입니다.
쿼리문이나 패치하는 칼럼의 값을 체크 해보셔야 겠네요..

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

wizcat의 이미지

아마도 query문 뒤에 ; 를 빼면 될것 같군여.. ^^

shean0의 이미지

Quote:
Connected to ORACLE as user: sean
[500][중암교 ]
[4001][봉일천초등교 ]
[5000][종로구청 ]
ending==
이렇게 결과가 나오는데요..
그런데.. #ifdef ~#endif 안에 있는것처럼... where DE_ID IN ( XX,TT,yy..)
이렇게 xx,TT,yy 의 갯수가 바뀌거든요.
그래서 처음에 질문드린것처럼 sprintf로 select문을 만들어서..query하려구 하는데...
후..이거 3일째...

int search_name_node(char *buf,int count_name)
{
    char what;
    int num_ret;
    EXEC SQL BEGIN DECLARE SECTION;
        int   H_query_cnt;
        int   H_DE_ID;
        int   H_NAME_SIZE;
        char  H_NODE_NAME[31];
        char  Sqlcmd[1000]; 
    EXEC SQL END DECLARE SECTION;
    memset(Sqlcmd,0x0,sizeof(Sqlcmd));
    sprintf(Sqlcmd,"%s", "Select de_id,node_name from rotis_node_0117 where de_id in ( 4001, 500 ,5000) order by de_id;");   
    printf("Sqlcmd[%s]\n",Sqlcmd);
    what=0x03;  /* Rotis query result를 만든다. */
    num_ret=0;
    db_connect();
#ifdef TEST1

   EXEC SQL WHENEVER SQLERROR DO sql_error("search_name_node Error \n");
   EXEC SQL PREPARE my_cur3 FROM :Sqlcmd; 
   EXEC SQL DECLARE MY_STM1 CURSOR FOR my_cur3;
   EXEC SQL OPEN MY_STM1;
   EXEC SQL WHENEVER NOT FOUND DO break;
   while(1)
   {
        EXEC SQL FETCH MY_STM1 INTO :H_DE_ID,:H_NODE_NAME;
        printf("[%d]", H_DE_ID);
        printf("[%s]", H_NODE_NAME);
        printf("\n");
   }
   EXEC SQL CLOSE  MY_STM1;
   EXEC SQL COMMIT WORK RELEASE;
#endif
   EXEC SQL WHENEVER SQLERROR DO sql_error("search_name_node Error \n");
   EXEC SQL DECLARE MY_cur4 CURSOR FOR 
      Select de_id,node_name from rotis_node_0117 where de_id in ( 4001, 500 ,5000) order by de_id;  
   EXEC SQL OPEN MY_cur4;
   while(1)
   {
        EXEC SQL FETCH MY_cur4 INTO :H_DE_ID,:H_NODE_NAME;
        printf("[%d]", H_DE_ID);
        printf("[%s]", H_NODE_NAME);
        printf("\n");
   }
   EXEC SQL CLOSE  MY_cur4;
   EXEC SQL COMMIT WORK RELEASE;


printf("ending==");
}

언제나 즐프를 꿈꾸며~

shean0의 이미지

아..
아.. 정말로 감사드립니다...
그건 어떻게 생각하지두 못햇던것인데...
그런데...그거 있는것과 없는것의 차이는 무엇이죠??? ::

그리고.. 한가지만 더요.
지금
from TABLE_NAME 에서 테이블네임을
#define TABLE_NAME my_ex_table
이렇게 하니깐.. table을 못 &#52287;는다고 나오던데요??
proc는 define적용되는 부분이
select
from XXX <== 여기는 적용되는 범위가 아닌가요??

언제나 즐프를 꿈꾸며~

shean0의 이미지

아래에서

int search_name_node_match(struct Protocl_700 *P,int count )
{
   
    char what;
    int num_ret;
    int cnt;
    char *tmp;
    EXEC SQL BEGIN DECLARE SECTION;
        int   H_query_cnt;
        int   H_DE_ID;
        char  H_NODE_NAME[31];
        int   H_NAME_LEN;
    EXEC SQL END DECLARE SECTION;

    db_connect()
  /*  ====> for(i=0;i<count;i++)
    여기서 호출해서 결과를 받을려구요 
    <===         
 :::::::compile result===>
   match_index_nodename                myproc.o
ld: 치명적: 기호 참조 오류. tele_sok에 출력이 기록되지 않음  */
 db_connect();
   H_DE_ID=100;
   match_index_nodename(H_DE_ID,H_NODE_NAME,H_NAME_LEN);            
   printf("H_NODE_NAME[%s][%d]",H_NODE_NAME,H_NAME_LEN); 
   /*이거 call할려면 뭐 include 해야 하지 않을까요?? */
     
    EXEC SQL COMMIT WORK RELEASE;  
   
   EXEC SQL COMMIT WORK RELEASE;  

   printf("ending==");
   return cnt;
}

CREATE OR REPLACE PROCEDURE match_index_nodename( as_index    IN  number,
                                      as_node_name out  VARCHAR2,
                                      as_name_len  out  number )
IS
   s_msg   VARCHAR2(50)  := '성공' ;
BEGIN
   BEGIN
     SELECT node_name,lengthb(node_name) INTO as_node_name,as_name_len  FROM rotis_node_0117
           WHERE de_id=as_index;
      IF SQL%ROWCOUNT = 1 THEN
         COMMIT;
      END IF;
  exception
      when others then
          s_msg:='입력 안되었네';
          RAISE;
   END;

#   as_node_name := s_msg ;
EXCEPTION
   WHEN OTHERS THEN
      ROLLBACK;
      as_node_name := s_msg ;

      dbms_output.put_line('<<< ERROR >>>>>>>>>>>>');
      dbms_output.put_line('에러코드 : ' || SQLCODE);
      dbms_output.put_line('에러내용 : ' || SUBSTR(SQLERRM, 1, 100));
END;
/

를 만들고..아래와 같이 실행하였습니다

expandtab: 해당 옵션 없음 - 모든 옵션 값 지정은 'set all'
"call_procedure.sql" 9 행, 258 문자 
declare
  s_input      number       :=100;
  s_name       varchar2(30) :='';
  s_name_len   number       :=0;
begin
  match_index_nodename(s_input,s_name,s_name_len);
  dbms_output.put_line('input'||s_input||'==>'||s_name||':'||s_name_len||'ending');
end;
/
SQL> Set ServerOutput On Size 30000
SQL> start call_procedure
input100==>수유사거리동단:14ending
    //  ===      =========  ==
    //  input      out                out 
PL/SQL procedure successfully completed.

여기까지 했는데... 실제 proc에서 호출을 하는 예제를 본 적이 없어서..
어떻게 호출해야 하는지.. 알려주셨으면 합니다..

그리고 호출하는 곳에서 for 문으로 count 만큼 돌릴것인데...DB에 무리 없겠죠..처음에는 select문에 IN(...)을 써서 조회할려구 했는데..IN의 갯수가 한정적이라고 해서.. count가 보통 100개정도 되거든요...

조언을 부탁드립니다..꾸벅..

언제나 즐프를 꿈꾸며~

shean0의 이미지

int search_name_node_match(struct Protocl_700 *P,int count )
{

    char what;
    int num_ret;
    int cnt;
    char *tmp;
    EXEC SQL BEGIN DECLARE SECTION;
        int   H_query_cnt;
        int   H_DE_ID;
        char  H_NODE_NAME[31];
        int   H_NAME_LEN;
    EXEC SQL END DECLARE SECTION;
    db_connect();
    H_DE_ID=100;
 /*EXEC SQL WHENEVER NOT FOUND DO break; <===여기 넣으면 없어져야 할것으로 예상했는데... */
EXEC SQL EXECUTE
 BEGIN
     match_index_nodename(:H_DE_ID,:H_NODE_NAME,:H_NAME_LEN);
 END;
END-EXEC;
   printf("H_NODE_NAME[%s][%d]",H_NODE_NAME,H_NAME_LEN);

    EXEC SQL COMMIT WORK RELEASE;
    printf("ending==");
   return cnt;
}

PROCFLAGS=SEMANTICS USERID=sean/sean_ocl
#                                                     ID   / PASSWD
~~~
.SUFFIXES: .pc .c .o .typ .h
.pc.c:
        $(PROC) $(PROCFLAGS) iname=$*
.pc.o:
        $(PROC) $(PROCFLAGS) iname=$*
        $(CC) $(CFLAGS) -c $*.c $(INCLUDE)
.c.o:
        $(CC) $(CFLAGS) -c $*.c $(INCLUDE)
이렇게 하고..나니 ...컴파일이 되는가 더니...
myproc.c: In function `search_name_node_match':
myproc.c:1158: break statement not within loop or switch
*** Error code 1

이런 결과가...이거는 왜..나오는지??????

또 옵션이 있는건가요? ..
그리고 오라클 에러 처리에 대해서...자료 없을까요?? 이거는 처음 사용해 보아서...어디에서 에러가 나올지..도대체..예상을 할 수가 없거든요..매번 부탁만...

꾸벅

언제나 즐프를 꿈꾸며~

댓글 달기

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