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하는 방식)에서는 정상 수행됨을 확인하였습니다. 


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


    감사합니다~.


  1. No Image notice by admin 2024/04/23 by admin
    Views 136 

    CUBRID 사용자를 위한 DBeaver 도구 출시 안내

  2. SQLGate for CUBRID 영구 무료 라이선스 제공

  3. cubridmanager 실행시 오류 입니다.

  4. php 모듈 설치중 configure 오류 입니다.

  5. esql 컴파일시 에러

  6. Insert 후 OID 가져오기...

  7. DBMS dead 현상

  8. 최신 설치 메뉴얼

  9. PHP 모듈 설치중 문제입니다.

  10. ha 구성시 큐브리드 매니저를 이용한 db사용자 생성 문의드립니다.

  11. 며칠전부터 데이터베이스 백업이 자동으로 되지 않습니다.

  12. 주가 데이터를 큐브리드로 수집하려고 하는데요.. 큐브리드가 부하를 어느정도까지 버틸 수 있을까요

  13. 엑셀에서 oledb등록하려고 하니까 이런 오류가 나네요

  14. 워드프레스를 사용중입니다..

  15. CM 건의 드립니다....

  16. OLEDB 이용하여 OUTER JOIN 에러

  17. 질문이라고 할 수 있을려나..

  18. 전체 자동시작이 되지 않습니다.

  19. 어느 방식이 빠를까요?

  20. 테이블 필드 추가 후 위치변경 하기

  21. CUBRID CCI Library 를 이용한 CUBRID PHP Extension 설치하기 문의입니다.

  22. cubrid service stop 이 안됩니다

Board Pagination Prev 1 ... 155 156 157 158 159 160 161 162 163 164 ... 201 Next
/ 201

Contact Cubrid

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