PowerBuilder에서 MariaDB와 연동 시, DECIMAL 컬럼을 SELECT INTO
구문으로 가져올 때 변수 타입을 숫자형(long, double)이 아닌 string으로 받아야 정상적으로 값이 들어오는 경우가 있다.
그걸 내가 당했다... 몇시간동안 쿼리가 맞고 입력한 변수타입도 맞는데 입력이 안되더라....
1. 문제 상황
다음과 같은 코드를 PowerBuilder에서 실행하면 오류가 발생할 수 있다.
long ll_a
SELECT b INTO :ll_a FROM "테이블명" WHERE "조건1" = '"test"';
하지만 아래처럼 string
으로 받으면 정상 작동한다.
string ls_a
SELECT b INTO :ls_a FROM "테이블명" WHERE "조건1" = '"test"';
원인이 뭘까?
MariaDB의 ODBC 드라이버는
MariaDB의 ODBC 드라이버는
DECIMAL
타입을 PowerBuilder에서 처리할 수 없는 방식(SQL_NUMERIC)으로 전달하며, 이 과정에서 타입 변환 오류가 발생할때도 있다.2. DECIMAL → 숫자형 오류의 원인
- DECIMAL은 정밀한 소수점 연산을 위해 설계된 고정소수점 숫자 타입
- MariaDB ODBC 드라이버는 이를
SQL_NUMERIC
또는SQL_DECIMAL
로 전달 - PowerBuilder에서는 이를 숫자형으로 받을 경우 변환 오류 발생 가능 (특히 소수점 존재 시)
3. 해결 방법
방법 1: string으로 받은 후 변환
string ls_a
long ll_a
SELECT b INTO :ls_a FROM "테이블명";
ll_a = Long(ls_a)
방법 2: SQL에서 명시적으로 캐스팅
SELECT CAST(b AS SIGNED) INTO :ll_a FROM "테이블명";
방법 3: ODBC 드라이버 버전 업그레이드
MariaDB Connector/ODBC 3.1.22 이상의 버전에서는 DECIMAL 처리 개선됨
공식 다운로드 페이지에서 최신 드라이버 사용 권장
4. 전체 예제 코드
declare cur_result cursor for
select a, b, c, d, e
from "테이블명"
where "조건1" = '"test"' and "조건2" = '"test1"';
open cur_result;
do while true
fetch cur_result into :"변수1", :ls_a, :ls_b, :ls_c, :"변수2"
if sqlca.sqlcode <> 0 then exit
loop
close cur_result;
5. 결론
PowerBuilder에서 MariaDB의 DECIMAL
컬럼은 내부적으로 string
처리하는 것이 가장 안전하다. 실행 오류가 발생하거나 값이 안 들어오는 경우, 데이터 타입 매핑을 우선적으로 의심하고, 문자열로 받은 뒤 변환하는 방법을 적극 활용해야한다.
TIP: PowerBuilder는 ODBC 레이어를 통하므로 DBMS마다 같은 타입도 다르게 전달될 수 있다. 항상
SHOW COLUMNS
로 실제 데이터 타입을 확인해봐야 할거같다.