Background Image

FORUM

2010.11.24 09:22

update, delete 질문~

조회 수 8686 추천 수 0 댓글 5
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

아래에 이어 delete 문까지 안되는걸로 봐서 뭔가 빠트린듯 하여 소스 올립니다~

 

bind를 사용하면 cci_execute가 0으로 리턴 되네요~ 흠냐;;

 

그리고 bind를 사용 안하는 코드로 Delete 한 후에는 csql(큐브리드 메니저)에서는 분명히 없는대,

샘플 예제로 select 문을 수행하면 값이 있습니다. 두둥!! o_O

server, service 둘다 종료해서 다시 시작해도 똑같습니다.

 

도대체 무슨경우지;; OTL

====================================================================

// 안됨

 int req, res;

 char   *delete_sql = "DELETE FROM TBL_USER WHERE AND ID=?";
 
 char            buf[CUBRID_BUF_SIZE+1];
 T_CCI_ERROR     error;

 if ((req = cci_prepare( nConHandle, delete_sql, 0, &error)) < 0) {
... }

  if ((res = cci_bind_param(req, 1, CCI_A_TYPE_STR, (void *)"inimax", CCI_U_TYPE_STRING, (char)NULL)) < 0) {
...  }

  if ((res = cci_execute(req, 0, 0, &error)) < 0) {
...  }
  printf("%dn", res);


 if (cci_end_tran( nConHandle, CCI_TRAN_COMMIT, &error) < 0) {
...

 }

======================================================================

//잘됨

char   *delete_sql = "DELETE FROM TBL_USER WHERE ID='inimax'";
 
 char            buf[CUBRID_BUF_SIZE+1];
 T_CCI_ERROR     error;

 // 질의 컴파일을 수행한다.
 if ((req = cci_prepare( nConHandle, delete_sql, 0, &error)) < 0) {
... }
 
  // 질의를 수행한다.
  if ((res = cci_execute(req, 0, 0, &error)) < 0) {
...  }
  printf("%dn", res);
   
 // 에러없이 정상 처리되었으므로 커밋 처리한다.
 if (cci_end_tran( nConHandle, CCI_TRAN_COMMIT, &error) < 0) {
... }

 

 

  • ?
    샤롱스판 2010.11.24 21:07

    저도 비슷하게 cci API 를 이용하여 시험을 해보았는데..

    문제가 없이 잘 동작하는 것 같습니다.

     

    혹시 위에 첨부해주신 예제를 보면 char   *delete_sql = "DELETE FROM TBL_USER WHERE AND ID=?";

    WHERE AND 오타 때문이 아닐까요 ^^

     

    제가 해본 내용을 아래에 첨부해봅니다.

     

    $ cat cci.c
    #define BUF_SIZE        512

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "cas_cci.h"

    int port;

     

    insert_data(int con)
    {
            int     req, res;
    //      char    *sql = "insert into nation1(code,name) values(?, ?)";
            char    *sql = "delete from nation1 where code = ?";
            char    *code = "kor";
    //      char    *name = "...";
            char    buf[BUF_SIZE+1];
            T_CCI_ERROR     error;

            if ((req = cci_prepare(con, sql, 0, &error)) < 0) {
                    printf("prepare error[%d] %sn SQL: %sn", error.err_code, error.err_msg, sql);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);

                    return 0;
            }

            if ((res = cci_bind_param(req, 1, CCI_A_TYPE_STR, (void *)"kor", CCI_U_TYPE_STRING, (char)NULL)) < 0) {

                    cci_get_err_msg (res, buf, BUF_SIZE);
                    printf("bind error 1 [%d] %sn", res, buf);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);
                    return 0;
            }

            if ((res = cci_execute(req, 0, 0, &error)) < 0) {
                    printf("prepare error[%d] %sn SQL: %sn", error.err_code, error.err_msg, sql);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);
                    return 0;
            }

            if (cci_end_tran(con, CCI_TRAN_COMMIT, &error) < 0) {
                    printf("COMMIT ERROR [%d] %sn", error.err_code, error.err_msg);
                    return 0;
            }

            return 1;
    }


    main(int argc, char **argv)
    {
            int     con = 0;
            char    oid[39];
            int     res;
            char    buf[BUF_SIZE+1];
            T_CCI_ERROR     error;

            port = 33000;

            if ((con = cci_connect("localhost", port, "demodb", "PUBLIC", "")) < 0) {
                    printf("localhost demodb connection errorn");
                    exit(-1);
            }

            if (insert_data(con) == 0) {
                    printf("Error input datan");
                    cci_disconnect(con, &error);
                    exit(-1);
            }

            cci_disconnect(con, &error);

    }

     

    $ gcc -o cci cci.c -I$CUBRID/include -L$CUBRID/lib -lcascci


    $ csql demodb -c "insert into nation1(code,name) values('kor','x')"


    $ csql demodb -c "select * from nation1"

    === <Result of SELECT Command in Line 1> ===

      code                  name                  continent             capital
    ========================================================================================
      'kor'                 'x'                   NULL                  NULL

     

    $ ./cci


    $ csql demodb -c "select * from nation1"

     

    === <Result of SELECT Command in Line 1> ===

    There are no results.


    $ cubrid_rel

    CUBRID 2008 R3.1

  • ?
    봉봉나무 2010.11.25 08:14

    와~ 친절한 답변 감사합니다~

     

    드디어 원인을 찾았습니다. ^^

     

    1. Delete로 레코드 지운후 Select로 할 경우 나타나는 경우는, 제가 cci_cursor 를 잘못 사용해서(위치를) 나타나는 문제입니다.

    2. Bind로 삭제가 안됬던 문제는 table 특성을 타는듯 하네요~ 아래 코드로 확인좀 부탁드립니다~ ^^;

     

    테스트 내용 첨부 합니다.

     

    CREATE TABLE "tbl_test"(
    "mac_address" character varying(20) NOT NULL UNIQUE,
    "id" character varying(20)
    );
    ALTER TABLE "tbl_test" PARTITION BY HASH (mac_address) PARTITIONS 20;

     

    ===================================================================

    #define BUF_SIZE        512

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "cas_cci.h"

    int port;

    int delete_data(int con)
    {
            int     req, res;
           
            char    *sql = "delete from tbl_test where mac_address = ?";
    //        char    *sql = "delete from tbl_test where id = ?";

            char    buf[BUF_SIZE+1];
            T_CCI_ERROR     error;

            if ((req = cci_prepare(con, sql, 0, &error)) < 0) {
                    printf("prepare error[%d] %sn SQL: %sn", error.err_code, error.err_msg, sql);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);

                    return 0;
            }

            if ((res = cci_bind_param(req, 1, CCI_A_TYPE_STR, (void *)"00-24-54-65-BD-E5", CCI_U_TYPE_STRING, (char)NULL)) < 0) {
    //        if ((res = cci_bind_param(req, 1, CCI_A_TYPE_STR, (void *)"abcd", CCI_U_TYPE_STRING, (char)NULL)) < 0) {

                    cci_get_err_msg (res, buf, BUF_SIZE);
                    printf("bind error 1 [%d] %sn", res, buf);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);
                    return 0;
            }
     
            if ((res = cci_execute(req, 0, 0, &error)) < 0) {
                    printf("prepare error[%d] %sn SQL: %sn", error.err_code, error.err_msg, sql);
                    cci_end_tran(con, CCI_TRAN_ROLLBACK, &error);
                    return 0;
            }
      
      printf("Delete cci_execute [%d]n", res);
      
            if (cci_end_tran(con, CCI_TRAN_COMMIT, &error) < 0) {
                    printf("COMMIT ERROR [%d] %sn", error.err_code, error.err_msg);
                    return 0;
            }

            return 1;
    }


    main(int argc, char **argv)
    {
            int     con = 0;
            char    oid[39];
            int     res;
            char    buf[BUF_SIZE+1];
            T_CCI_ERROR     error;

            port = 33000;

            if ((con = cci_connect("localhost", port, "demodb", "PUBLIC", "")) < 0) {
                    printf("localhost servicedb connection errorn");
                    exit(-1);
            }

            if (delete_data(con) == 0) {
                    printf("Error input datan");
                    cci_disconnect(con, &error);
                    exit(-1);
            }

            cci_disconnect(con, &error);

    }

    ==========================================================

    --> id key 사용

    $ csql demodb -c "insert into tbl_test(mac_address,id) values('00-24-54-65-BD-E5','abcd')"
    $ csql demodb -c "select * from tbl_test"

    === <Result of SELECT Command in Line 1> ===

      mac_address           id                 
    ============================================
      '00-24-54-65-BD-E5'   'abcd'    

     

    $ gcc -o cci testclient.c -I$CUBRID/include -L$CUBRID/lib -lcascci
    $ ./cci
    Delete cci_execute [1]

     

    $ csql demodb -c "select * from tbl_test"

    === <Result of SELECT Command in Line 1> ===

    There are no results.

     

    --> mac_address key 사용

    $ csql demodb -c "insert into tbl_test(mac_address,id) values('00-24-54-65-BD-E5','abcd')"
    $ csql demodb -c "select * from tbl_test"

    === <Result of SELECT Command in Line 1> ===

      mac_address           id                 
    ============================================
      '00-24-54-65-BD-E5'   'abcd'             

     

    $ gcc -o cci testclient.c -I$CUBRID/include -L$CUBRID/lib -lcascci
    $ ./cci
    Delete cci_execute [0]


    $ csql demodb -c "select * from tbl_test"

    === <Result of SELECT Command in Line 1> ===

      mac_address           id                 
    ============================================
      '00-24-54-65-BD-E5'   'abcd' 

     

  • ?
    샤롱스판 2010.11.26 01:44

    결론부터 말씀드리면 버그인 것 같습니다.  PARTITIONED BY HASH를 적용한 테이블에서 문제가 발생하는 것을 확인했으며 버그는 등록하였습니다. 리포팅 감사드립니다~

  • ?
    봉봉나무 2010.11.26 02:13

    네~ 답변 감사합니다~

    다음에 나올 버전에서 사용하면 되겠네요~

    그럼 수고하세요~

  • ?
    brightest 2010.12.02 03:42

    추가로 저희가 조사한 사항-우회방안을 말씀드리고자 합니다. 


    현재 PARTITIONED BY HASH를 적용한 테이블에서 PARTITION 대상 컬럼에 대해 

     * dynamic sql (prepare-execute 방식)으로 수행하면 해당 버그가 발생하고요, 

     * static sql (prepare 없이 조건값을 직접 입력하여 execute하는 방식)에서는 정상 수행됨을 확인하였습니다. 


    이점 참고하여 주시기 바랍니다. 


    감사합니다~.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 48
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4458
814 워드프레스를 사용중입니다.. 1 aalloo 2010.12.06 8820
813 CM 건의 드립니다.... 1 유니콘 2010.12.04 10106
812 OLEDB 이용하여 OUTER JOIN 에러 1 redhope 2010.12.04 8671
811 질문이라고 할 수 있을려나.. 1 지니보이 2010.12.03 7368
810 전체 자동시작이 되지 않습니다. 2 또랑 2010.12.03 8003
809 어느 방식이 빠를까요? 1 봉봉나무 2010.12.03 6966
808 테이블 필드 추가 후 위치변경 하기 2 건빵 2010.11.29 10222
807 CUBRID CCI Library 를 이용한 CUBRID PHP Extension 설치하기 문의입니다. 2 책보는남자 2010.11.29 8561
806 cubrid service stop 이 안됩니다 2 유니콘 2010.11.27 8334
805 windows sever 2008 64bit R2 서버에서 사용 질문. 1 김우람 2010.11.25 8083
804 Windows 2008 서버 backupdb 오류 문의 1 김소영 2010.11.25 7853
» update, delete 질문~ 5 봉봉나무 2010.11.24 8686
802 XE 이전에 관해... 15 sugarkane 2010.11.24 10616
801 cci-api udpate 질문입니다~ 4 봉봉나무 2010.11.23 8199
800 세로 데이터를 가로로 출력 문의 2 jjobi 2010.11.20 14268
799 연결(Connection)을 얻을 수 없습다. 브로커와 서버의 구동상태를 점검하십시오. 6 baeheulk 2010.11.18 11391
798 ODBC를 통해 데이터 조회시 UTF8로 저장되어 있는 데이터를 읽어오려면 어떻게 해야 하나요. 3 인류의위기 2010.11.18 8006
797 Broker 에러가 자주 납니다. 1 아르게네스 2010.11.17 7321
796 유져 권한에 대해 2 가루구 2010.11.16 8418
795 에러 질문 : cci_glo_load? 1 sugarkane 2010.11.15 8190
Board Pagination Prev 1 ... 155 156 157 158 159 160 161 162 163 164 ... 200 Next
/ 200

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales