Background Image
응용개발
2008.11.21 17:31

embedded sql 에서 char 사용시 주의 사항

조회 수 19008 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
embedded sql 에서 host variable 을 사용할 경우 char type 에 대하여 where 절에 사용시 주의하여야 합니다.
비교하고자 하는 대상의 정확한 length(스키마상의 length)를 알아내고 host variable 상의 실제 데이터의 length(strlen) 이 비교대상의 스키마상의 length 보다 작은 경우 나머지는 공백으로 채워주어야만 정확한 비교 결과를 만들어 냅니다.
즉, name char(10) 일 경우 where name = :name 에서 strcpy(name, ‘1234’) 는 결과가 없지만 strcpy(name, ‘1234      ‘) 는 결과가 나올 수 있게 됩니다.

아래는 테스트를 위한 SQL 입니다.
create class t ( name char(10), addr varchar(10))
insert into t values(''''1234'''', ''''1234'''')
name                  addr
============================================
''''1234      ''''          ''''1234''''

아래는 예제 C source 입니다.
#include <stdio.h>

main()
{
        exec sql begin declare section;
                char    c[10];
                VARCHAR vc[10];
                char    rtn[10];
        exec sql end declare section;

        uci_startup("test");
        exec sql connect ''''demodb'''';

        strcpy(c, "1234");
        exec sql declare c0 cursor for
                select name from t where name = :c;
        exec sql open c0;
        exec sql fetch c0 into :rtn;
        printf("0. where char=(%s) : result count=%dn", c, SQLERRD[2]);
        exec sql close c0;

        strcpy(c, "1234      ");
        exec sql declare c1 cursor for
                select name from t where name = :c;
        exec sql open c1;
        exec sql fetch c1 into :rtn;
        printf("1. where char=(%s) : result count=%dn", c, SQLERRD[2]);
        exec sqlx close c1;

        strcpy(c, "12");
        exec sqlx declare c2 cursor for
                select name from t where substr(name,1,2) = :c;
        exec sqlx open c2;
        exec sqlx fetch c2 into :rtn;
        printf("2. where substr(char,1,2)=(%s) : result count=%dn", c, SQLERRD[2]);
        exec sql close c2;

        strcpy(c, "12        ");
        exec sql declare c3 cursor for
                select name from t where substr(name,1,2) = :c;
        exec sql open c3;
        exec sql fetch c3 into :rtn;
        printf("3. where substr(char,1,2)=(%s) : result count=%dn", c, SQLERRD[2]);
        exec sql close c3;

        strcpy(vc.array, "1234");
        exec sql declare c4 cursor for
                select name from t where addr = :vc;
        exec sql open c4;
        exec sql fetch c4 into :rtn;
        printf("4. (NO vc.length) where varchar=(%s) : result count=%dn", vc.array, SQLERRD[2]);
        exec sql close c4;

        strcpy(vc.array, "1234");
        vc.length = strlen(vc.array);
        exec sql declare c5 cursor for
                select name from t where addr = :vc;
        exec sql open c5;
        exec sql fetch c5 into :rtn;
        printf("5. where varchar=(%s) : result count=%dn", vc.array, SQLERRD[2]);
        exec sql close c5;

        strcpy(vc.array, "1234      ");
        vc.length = strlen(vc.array);
        exec sql declare c6 cursor for
                select name from t where addr = :vc;
        exec sql open c6;
        exec sql fetch c6 into :rtn;
        printf("6. where varchar=(%s) : result count=%dn", vc.array, SQLERRD[2]);
        exec sql close c6;

        strcpy(vc.array, "12");
        exec sql declare c7 cursor for
                select name from t where substr(addr,1,2) = :vc;
        exec sql open c7;
        exec sql fetch c7 into :rtn;
        printf("7. where substr(varchar,1,2)=(%s) : result count=%dn", vc.array, SQLERRD[2]);
        exec sql close c7;

        exec sql disconnect;
}


아래는 실행결과입니다.
0. where char=(1234) : result count=0
1. where char=(1234      ) : result count=1
2. where substr(char,1,2)=(12) : result count=0
3. where substr(char,1,2)=(12        ) : result count=1
4. (NO vc.length) where varchar=(1234) : result count=1
5. where varchar=(1234) : result count=1
6. where varchar=(1234      ) : result count=1
7. where substr(varchar,1,2)=(12) : result count=1

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
19 질의작성 CUBRID DB 내의 auto_increment 값을 초기화 하자. 손승일 2009.10.28 29732
18 운영관리 큐브리드 사용포트 정리 3 정만영 2009.06.19 29776
17 마이그레이션 CUBRID 하위버젼에서 CUBRID2008로의 업그레이드 방법 1 남재우 2008.12.06 30154
16 운영관리 CUBRID 사용시 방화벽 설정 3 admin 2008.11.21 30996
15 응용개발 php에서 serialize/unserialize 사용 시 주의할 점 시난 2009.12.29 31628
14 CUBRID 매니저 Java SP사용시 JNI_CreateJavaVM 에러메시지 해결 방법 file seongjoon 2009.07.15 32043
13 마이그레이션 MySQL의 limit 명령어 처리 1 admin 2008.11.21 32685
12 운영관리 CUBRID에서의 BLOB/CLOB 사용시 백업 및 복구에 대한 주의 점 cubebridge 2012.09.18 33157
11 응용개발 CUBRID AUTO_INCREMENT 컬럼 MySQL LAST_INSERT_ID() 대체 방법 손승일 2009.12.22 33235
10 기타 좀비 프로세스 일괄 삭제하기 janus 2009.12.12 34956
9 응용개발 JDBC 사용시 SQL 로깅 - p6spy 사용 1 웁쓰 2009.07.01 36001
8 질의작성 예약어를 테이블명이나 컬럼명으로 사용시 admin 2008.11.21 37422
7 질의작성 데이터 존재하면 update, 존재하지 않으면 insert 방법(ON DUPLICATE KEY UPDATE) 손승일 2010.08.11 37999
6 마이그레이션 타 DBMS를 CUBRID로 마이그레이션 시 varchar,char 컬럼 사이즈 관련 손승일 2010.07.01 38024
5 응용개발 Weblogic 10.0 사용시 JDK 1.5를 사용한 JDBC 드라이버 사용시 주의사항. cubebridge 2012.02.22 51957
4 응용개발 WHERE 조건에서 다중 컬럼 IN절 처리 최적화 방법 (cubrid + ibatis) 1 이상신 2015.08.21 55135
3 응용개발 weblogic 8.1 에 CUBRID Connection Pool, DataSource 설정 방법 file 웁쓰 2009.07.01 66306
2 마이그레이션 CUBRID vs MySQL vs ORACLE SQL 타입별 비교 정만영 2013.07.12 69161
1 운영관리 csql 데이터 입력방법 정만영 2009.06.09 213311
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
/ 14

Contact Cubrid

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