ORA-00911: invalid character [proc 에서..에러]
이런 메세지가 왜 ...나오는지..도저히..소스를 봐도..
알수가없네요..
안녕하세요..지금 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에서 //의 주석은 통하지 않습니다.모든 주석은 /* */로
pro*c에서 //의 주석은 통하지 않습니다.
모든 주석은 /* */로만 가능합니다.
물론 c에서와 같이 주석안에 주석은 허용되지 않습니다.
invallid char...
Connected to ORACLE as user: sean //연결성공시 로그
search_name_node Error // whenever sqlerror 시 분기 함수
로그...
ORA-00911: invalid character // 그때의 내용입니다.
아 .. 이것은 왼쪽이 실제 프로그램 돌았을때 로그(printf)구요..그냥 옆에다가 //해서 주석처럼 달은것 뿐입니다.
분명이..무엇이 틀린것일텐데..컴파일시에는 아무 이상이 없다고 나오거든요...
런 타임에서나오는데...이거 왜그런지...
언제나 즐프를 꿈꾸며~
에러가 날때의 sql문을 찍어보세요..
아래는 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
아마도 query문 뒤에 ; 를 빼면 될것 같군여.. ^^
아마도 query문 뒤에 ; 를 빼면 될것 같군여.. ^^
다시 한번 올립니다..
그런데.. #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=="); }언제나 즐프를 꿈꾸며~
아..정말로 감사드립니다... 그런데#define 으로..
아..
아.. 정말로 감사드립니다...
그건 어떻게 생각하지두 못햇던것인데...
그런데...그거 있는것과 없는것의 차이는 무엇이죠??? ::
그리고.. 한가지만 더요.
지금
from TABLE_NAME 에서 테이블네임을
#define TABLE_NAME my_ex_table
이렇게 하니깐.. table을 못 찿는다고 나오던데요??
proc는 define적용되는 부분이
select
from XXX <== 여기는 적용되는 범위가 아닌가요??
언제나 즐프를 꿈꾸며~
proc에서 procedure호출 방법은??
아래에서
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개정도 되거든요...
조언을 부탁드립니다..꾸벅..
언제나 즐프를 꿈꾸며~
not in break 에서요...
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)이렇게 하고..나니 ...컴파일이 되는가 더니...이런 결과가...이거는 왜..나오는지??????
또 옵션이 있는건가요? ..
그리고 오라클 에러 처리에 대해서...자료 없을까요?? 이거는 처음 사용해 보아서...어디에서 에러가 나올지..도대체..예상을 할 수가 없거든요..매번 부탁만...
꾸벅
언제나 즐프를 꿈꾸며~
댓글 달기