Background Image

FORUM

조회 수 131 추천 수 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
번호 제목 글쓴이 날짜 조회 수
공지 CUBRID 사용자를 위한 DBeaver 도구 출시 안내 admin 2024.04.23 136
공지 SQLGate for CUBRID 영구 무료 라이선스 제공 file admin 2020.04.09 4477
3885 ADO.NET에서 자바 저장함수 호출 2 kdknim21 2014.11.01 8420
3884 ADO.Net 사용중입니다. 상태확인 방법을 알고 싶습니다. 1 CUCUCUCU 2015.10.22 5691
3883 ADO.net Driver 변경 시 cascci.dll 로드할 수 없다는 오류 1 물병 2017.07.25 503
3882 ADO.net 또는 ODBC에 대한 질문입니다. 12 세스카 2012.03.20 13378
3881 ADO이용시 OLEDB Driver에러 2 flypig 2010.01.29 15619
3880 AIX에 CUBRID 설치 후 오류사항 문의 1 최명호 2015.06.02 7736
3879 ALTER 로 PK 여러 개 지정하고싶습니다 4 사탕구름 2021.07.21 838
3878 ARRAY 데이터 타입에 대한 SQL 질문 3 지용 2010.10.08 10246
3877 AUTO INCREASE 가 편집이 안됨 2 file 큐브리드어려워요 2022.02.08 269
3876 AUTO_INCREMENT 수동 증가 문의 2 cubrid초보 2021.08.19 729
3875 AUTO_INCREMENT 컬럼 이용시 2 hyperhand 2009.12.22 17650
3874 AVG 함수관련 질문드려요 1 구름마음 2013.06.10 13678
3873 Ado.NET : Cannot connect to CUBRID CAS 오류 2 websiter 2017.05.05 57919
3872 Ado.net. ExecuteNonQuery의 반환값이 항상 0 입니다. 2 모비23 2019.01.08 1486
3871 An IOException was caught during reading the inputstream 1 익명2 2015.11.26 6872
3870 An IOException was caught during reading the inputstream 1 익명2 2015.11.26 6835
3869 An IOException was caught during reading the inputstream. 오류 조치방법 좀 알려주세요. 1 ldev27 2019.10.29 317
3868 An internal error occurred during: "Fetching children of <DB명>". java.lang.NullPointerException 에러 4 ysh 2021.04.06 490
3867 Apm_setup7로 자동설치시 연동이 안되는데... 1 또랑 2010.11.08 8277
3866 Archive Log만으로 타임복구가 가능한가요? 4 핑핑크 2016.04.29 9821
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 201 Next
/ 201

Contact Cubrid

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