database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9474 게시물 읽기
No. 9474
libpq 바이너리 데이터 PQexecPrepared 하는 방법 관련
작성자
김성은(x86ddk)
작성일
2014-10-21 14:05
조회수
10,748

수고 많으십니다.

libpq로 삽질을 좀 하고 있습니다.

 

PQprepare / PQexecPrepared 를 통해서 바이너리 데이터 인자를 담아서 쿼리를 수행시키고자 합니다.

근데 이게 쉽지가 않네요...

컬럼은 numeric 타입으로 하나 만들어 두었구요....

다음처럼 테스트코드를 만들어서 해보았는데 잘 안되네요...

numeric* pn1 = PGTYPESnumeric_new();

PGTYPESnumeric_from_double(2.0, pn1);

oidTypes[0] = NUMERICOID;

paramLengths[0] = sizeof(numeric);

paramFormat[0]  = 1; //binary

paramValues[0] = (char*)pn1;

/////////////////////////////////////////////////////////////////////////////////

PQPrepare(conn, stname, "UPDATE test SET a = $1", 1, oidTypes);

PQexexPrepared(conn, stname, 1, paramValues, paramLengths, paramFormats,0); 

 

prepare 까지는 되는데... execute 을 하면... invalid digit in external "numeric" value error 가  리턴되네요...

numeric 이나 decimal 을 바이너리 타입으로 prepare/excute 할 수 없을까요?...

 

이 글에 대한 댓글이 총 1건 있습니다.

 자답입니다.

postgresql 뉴스그룹과 구글링으로 삽질해보니...

결론적으로 백엔드 인터페이스를 참고하여(서버 소스 분석)...

백엔드쪽에서 처리되는 형식에 맞춰서 바이너리를 보내야 하는 것을 확인 하였습니다.

클라이언트쪽 PGTYPESnumeric 과 같은 함수들을 사용하게 되면 NumericVar 구조만 사용하게 되어 있어서 이 형식으로 보내면 서버가 인식하지 못합니다.

간단히 정리하자면,

서버쪽에서 numeric 을 처리하는 데에는 DB storage 형식에 맞는 바이너리 포맷이 있습니다. 이게 Numeric 구조체 이구요...Numeric구조를 산술연산에 쓰기위해 NumericVar를 이용합니다.

이 포맷을 네트워크 단으로 전송할 때 StringInfoBuf 라는 네트워크 전송포맷에 맞게 변환해 주어야 합니다.

이와 관련한 소스는 백엔드쪽 numeric_recv 와 numeric_send 를 참고하면 됩니다.

하고나니...이거야 말로 미친짓이 아닌가 합니다. 문자열로 보내면 될 것을 굳이 바이너리로 보낼 필요가 없는데...서버쪽에서 numeric 바이너리를 처리하는 부하도 상당하더군요...

그럼 수고들하세요~...

김성은(x86ddk)님이 2014-10-23 10:46에 작성한 댓글입니다.
이 댓글은 2014-10-23 10:50에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
9479pg_dump 사용법을 잘 몰라서 질문드립니다. [1]
최병윤
2014-11-03
11603
9478Oracle에서 Postgresql로 포팅시 문의 [2]
질문
2014-10-29
11897
947730분 단위로 데이터 가져오기 [3]
초보자
2014-10-28
12125
9474libpq 바이너리 데이터 PQexecPrepared 하는 방법 관련 [1]
김성은
2014-10-21
10748
9473pg_dump -T 옵션 다중 입력 [1]
주은철
2014-10-20
10483
9472libpq 를 통한 커서 Open [2]
김성은
2014-10-06
10903
9471시스템테이블 접근권한에 대해서 문의 드립니다. [1]
이호승
2014-10-02
11206
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다