Background Image

FORUM

2010.11.24 09:22

update, delete 질문~

조회 수 8687 추천 수 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 130
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4476
4002 안녕하세요 데이터 이전 간 버전 질문드립니다. 1 543534512 2024.05.08 18
4001 버전 업그레이드 후 쿼리오류 1 마로비 2024.05.07 45
4000 cubird python 에서 DB 목록 가져오기 1 망고라떼 2024.05.07 19
3999 Loaddb 유틸리티 사용시 log archive(lgar) 관련 문의 3 뚜벅뚜벅 2024.05.03 55
3998 큐브리드 구동 안됨[2] 3 마로비 2024.04.30 51
3997 큐브리드 구동 안됨 1 마로비 2024.04.30 31
3996 [데이터 이관] 큐브리드 데이터 이관 문의 4 뚜벅뚜벅 2024.04.30 81
3995 LIMIT사용 시 Outer join query optimization 문의 4 안녕 2024.04.30 48
3994 clob데이터 경로 바꿀수 있스니까? 1 자바천재 2024.04.29 49
3993 db에 저장되어 있는 CLOB 데이터의 위치가 어디로 저장되는지 확인하는 방법이 있을까요? 1 자바천재 2024.04.25 37
3992 큐브리드 서비스 시작이 안됩니다. 1 file 황남빵 2024.04.24 40
3991 큐브리드 JDBC 드라이버 XA문의 및 큐브리드 분산트랜잭션(XA) 지원 문의 1 몽키스패너 2024.04.24 35
3990 group_concat 변수 리턴 관련... 1 썬더기 2024.04.22 30
3989 기 DB에서 테이블 정보만 가져와서 다른 DB에 생성 1 바다소금 2024.04.22 26
3988 큐브리드 매니저 속도 문의 1 연동테스트용 2024.04.22 28
3987 cubrid count 속 2 kanin 2024.04.19 33
3986 cubrid 10.1 데이터 덮어쓰기 질문입니다. 4 ysk96 2024.04.18 87
3985 ACTION 명령어? 예약어? 1 투투투투기기 2024.04.17 25
3984 sql 구문 사용시 데이터 타입 decimal일 경우 1 투투투투기기 2024.04.11 36
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 201 Next
/ 201

Contact Cubrid

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