二进制类型
Vastbase提供两种不同的方法存储二进制数据。 二进制数据可以使用二进制数据类型 BYTEA存储在表中,或者使用大对象特性以一种特殊的格式将二进制数据存储在一个独立的表中, 然后通过在表中保存一个类型为 OID 的值来引用该表。
BYTEA
使用BYTEA类型存储二进制数据,例如:
CREATE TABLE lo_test_tab (id int, img bytea);
插入记录
/*二进制数据*/
char param1[20] = { 1, 2, 3, 4, 5, 6, 7, 8 };
SQLLEN cbParam1;
/*分配语句句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
if (!SQL_SUCCEEDED(rc))
{
printf("failed to allocate stmt handle");
exit(1);
}
/*预编译SQL*/
rc = SQLPrepare(V_OD_hstmt, (SQLCHAR *) "INSERT INTO lo_test_tab VALUES (1, ?)", SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLPrepare failed", V_OD_hstmt);
/*绑定参数*/
cbParam1 = 8;
rc = SQLBindParameter(V_OD_hstmt, 1, SQL_PARAM_INPUT,
SQL_C_BINARY, /* value type */
SQL_LONGVARBINARY, /* param type */
200, /* column size */
0, /* dec digits */
param1, /* param value ptr */
0, /* buffer len */
&cbParam1 /* StrLen_or_IndPtr */);
CHECK_STMT_RESULT(rc, "SQLBindParameter failed", V_OD_hstmt);
/* 执行*/
rc = SQLExecute(V_OD_hstmt);
CHECK_STMT_RESULT(rc, "SQLExecute failed", V_OD_hstmt);
在这里,SQLBindParameter时指定参数类型为SQL_LONGVARBINARY, 再将参数值的指针(char *类型)传入函数,即可将二进制数据写入。
读取记录
char buf[100];
SQLLEN ind;
/*分配句柄*/
rc = SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
/*执行查询*/
SQLExecDirect(V_OD_hstmt, (SQLCHAR *) "SELECT id, img FROM lo_test_tab WHERE id = 1", SQL_NTS);
/*获取结果*/
rc = SQLFetch(V_OD_hstmt);
CHECK_STMT_RESULT(rc, "SQLFetch failed", V_OD_hstmt);
/*读取数据*/
rc = SQLGetData(V_OD_hstmt, 2, SQL_C_BINARY, buf, sizeof(buf), &ind);
CHECK_STMT_RESULT(rc, "SQLGetData failed", V_OD_hstmt);
大对象
使用大对象存储二进制数据,例如:
create table image(name text, img oid);
插入记录
/* 分配语句句柄 */
SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
/* 使用服务端函数lo_import创建一个大对象,将其返回的大对象OID存入image.img字段中; /tmp/bfile.from 是预先准备好的服务端文件;执行用户需要具有sysadmin权限。*/
SQLExecDirect(V_OD_hstmt,(SQLCHAR *)"insert into image values('test image', lo_import('/tmp/bfile.from'))",SQL_NTS);
注意:这里使用的lo_import是服务端函数,不是客户端的libpq接口。
读取记录
/* 将大对象导出到服务端文件/tmp/bfile.to中。*/
SQLExecDirect(V_OD_hstmt,(SQLCHAR *)"select lo_export(image.img, '/tmp/bfile.to') from image where name = 'test image'",SQL_NTS);
注意:这里使用的lo_export是服务端函数,不是客户端的libpq接口。