Background Image

FORUM

조회 수 127 추천 수 0 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

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


* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.

OS
Linux 64bit
CUBRID Ver.
11.2
CUBRID TOOL Ver.
[도움말]-[버전정보] 확인
응용 환경(API)
cci c


* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.

 

에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
db link로 원격테이블 조회시 조건문에 바인딩변수가 필요할듯 한데 어떻게 구현해야할지 샘플 좀 부탁드립니다.

cubrid manual에서 제공하는 샘플에 쿼리문만 수정하여 테스트 해보는데 바인딩시 오류가 발생하더라구요.

수고하세요.

 

// Example to execute a query with a bind variable
// In Linux: gcc -o cci_bind cci_bind.c -m64 -I${CUBRID}/cci/include -lnsl ${CUBRID}/cci/lib/libcascci.so -lpthread

#include <stdio.h>
#include <string.h>
#include "cas_cci.h"
#define BUFSIZE  (1024)

int
main (void)
{
    int con = 0, req = 0, col_count = 0, i, ind;
    int error;
    char *data;
    T_CCI_ERROR cci_error;
    T_CCI_COL_INFO *col_info;
    T_CCI_CUBRID_STMT stmt_type;
//    char *query = "select * from nation where name = ?";
    char *query = "SELECT * FROM dblink (remote_srv, 'select code,name,continent,capital from public.nation where name = ?') AS t(code CHAR(3), name VARCHAR(40), continent VARCHAR(10), capital VARCHAR(30))";
    char namebuf[128];

    //getting a connection handle for a connection with a server
    con = cci_connect ("localhost", 33000, "demodb", "dba", "");
    if (con < 0)
    {
        printf ("cannot connect to database\n");
        return 1;
    }

    //preparing the SQL statement
    req = cci_prepare (con, query, 0, &cci_error);
    if (req < 0)
    {
        printf ("prepare error: %d, %s\n", cci_error.err_code,
              cci_error.err_msg);
        goto handle_error;
    }

    //Binding date into a value
    // 여기서 오류발생함
    strcpy (namebuf, "Korea");
    error =
    cci_bind_param (req, 1, CCI_A_TYPE_STR, namebuf, CCI_U_TYPE_STRING,
                    CCI_BIND_PTR);
    if (error < 0)
    {
        printf ("bind_param error: %d ", error);
        goto handle_error;
    }

    //getting column information when the prepared statement is the SELECT query
    col_info = cci_get_result_info (req, &stmt_type, &col_count);
    if (col_info == NULL)
    {
        printf ("get_result_info error: %d, %s\n", cci_error.err_code,
              cci_error.err_msg);
        goto handle_error;
    }

    //Executing the prepared SQL statement
    error = cci_execute (req, 0, 0, &cci_error);
    if (error < 0)
    {
        printf ("execute error: %d, %s\n", cci_error.err_code,
              cci_error.err_msg);
        goto handle_error;
    }

    //Executing the prepared SQL statement
    error = cci_execute (req, 0, 0, &cci_error);
    if (error < 0)
    {
        printf ("execute error: %d, %s\n", cci_error.err_code,
              cci_error.err_msg);
        goto handle_error;
    }

    while (1)
    {

        //Moving the cursor to access a specific tuple of results
        error = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &cci_error);
        if (error == CCI_ER_NO_MORE_DATA)
        {
            break;
        }
        if (error < 0)
        {
            printf ("cursor error: %d, %s\n", cci_error.err_code,
                  cci_error.err_msg);
            goto handle_error;
        }

        //Fetching the query result into a client buffer
        error = cci_fetch (req, &cci_error);
        if (error < 0)
        {
            printf ("fetch error: %d, %s\n", cci_error.err_code,
                  cci_error.err_msg);
            goto handle_error;
        }
        for (i = 1; i <= col_count; i++)
        {

            //Getting data from the fetched result
            error = cci_get_data (req, i, CCI_A_TYPE_STR, &data, &ind);
            if (error < 0)
            {
                printf ("get_data error: %d, %d\n", error, i);
                goto handle_error;
            }
            if (ind == -1)
            {
                printf ("NULL\t");
            }
            else
            {
                printf ("%s\t|", data);
            }
        }
            printf ("\n");
    }

    //Closing the request handle
    error = cci_close_req_handle (req);
    if (error < 0)
    {
        printf ("close_req_handle error: %d, %s\n", cci_error.err_code,
                cci_error.err_msg);
        goto handle_error;
    }

    //Disconnecting with the server
    error = cci_disconnect (con, &cci_error);
    if (error < 0)
    {
        printf ("error: %d, %s\n", cci_error.err_code, cci_error.err_msg);
        goto handle_error;
    }

    return 0;

handle_error:
    if (req > 0)
        cci_close_req_handle (req);
    if (con > 0)
        cci_disconnect (con, &cci_error);
    return 1;
}

 

  • ?
    오명환 2023.05.18 15:21
    dblink안에서 사용하는 remote 질의 내부에는 binding 변수(?)를 사용할 수 업습니다.
    대신, 다음과 같이 dblink를 사용한 질의에 조건절로 변경해서 사용하시면 됩니다.

    - 오류나는 질의
    SELECT * FROM dblink (remote_srv, 'select code,name,continent,capital from public.nation where name = ?') AS t(code CHAR(3), name VARCHAR(40), continent VARCHAR(10), capital VARCHAR(30))

    - 수정 질의
    SELECT * FROM dblink (remote_srv, 'select code,name,continent,capital from public.nation') AS t(code CHAR(3), name VARCHAR(40), continent VARCHAR(10), capital VARCHAR(30)) where name = ?
  • ?
    jjune1206 2023.05.18 16:18
    바인딩이 이런 방식뿐이 안된다면...
    원격테이블에서 레코드를 FULL로 획득해서 조건이 적용되는것처럼 보이는데
    인덱스는 무시될테고, 퍼포먼스에 영향이 있겠네요?
  • ?
    주영진 2023.05.18 17:08

    dblink (...) 외부에 있는 조건이라도 dblink (...) 에 해당하는 조건에 대해서는 조건을 Push 한 쿼리가 원격지에서 실행됩니다.

    select *
    from dblink (remote_srv, 'select code,name,continent,capital from public.nation') as t(code char(3), name varchar(40), continent varchar(10), capital varchar(30))
    where name = ?

    이 쿼리는 원격지에서 실행 될 때 'select code,name,continent,capital from public.nation where name = ?' 으로 쿼리가 만들어져서 실행됩니다.
    ? 에는 바인드한 값이 채워진 상태로 실행됩니다.

  • ?
    jjune1206 2023.05.18 17:52
    확인 감사합니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4443
3867 조회쿼리 시간단축 1 leeee 2023.06.30 98
3866 CUBRID 8.4.4 -> 11.0.3 로 업그레이드 시 발생할 문제가 있을까요? 1 SDDC사업개발자 2023.06.29 89
3865 CUBRID to Tibero DBLink지원 가능한지 알고싶습니다. 1 공공기관에서사용중1 2023.06.28 137
3864 ELO타입이 무엇인가요? 1 sobubble 2023.06.27 116
3863 백업파일 받았는데 복구하는 방법을 모르겠습니다. 4 Ggyak 2023.06.20 182
3862 UTF8 한글이 깨짐 4 file yonggi 2023.06.19 270
3861 저장 프로스저에 있는 함수 상세보기 문의입니다. 1 대출인생30년 2023.06.12 82
3860 MERGE INTO 속도 개선 문의 1 leeee 2023.06.12 129
3859 NX_transcation 1 yoo 2023.06.12 79
3858 cubrid cursor.close() 에러 관련질문 3 힘내자화이팅 2023.06.08 185
3857 merge 쿼리 속도개선 2 leeee 2023.06.08 109
3856 브로커(CAS)수 질문드립니다! 8 요시니 2023.06.05 152
3855 데이터 이관 문의입니다. 1 kipo0821 2023.05.30 129
3854 8.4.4 charset. Collation 확인 방법 네오랜덤 2023.05.24 185
3853 8.4.4버젼 charset 확인 3 네오랜덤 2023.05.23 190
3852 쿼리 속도 차이 질문 1 하얀미스 2023.05.18 142
3851 spring boot 에서 HikariPool-1 - Driver does not support get/set network timeout for connections. (java.lang.UnsupportedOperationException) 질문 드립니다. 3 kjaminam 2023.05.18 766
» cci 프로그래밍에서 DB LINK 관련 문의 4 jjune1206 2023.05.18 127
3849 큐브리드 매니저 실행이 오류 1 file 청주시청 2023.05.18 101
3848 ddl 추출 1 네오랜덤 2023.05.17 104
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 200 Next
/ 200

Contact Cubrid

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