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
비교하고자 하는 대상의 정확한 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