1. Документация на СУБД в таких случаях помогает.
2. В качестве издевательства, на память (возможны неточности,
без проверок на ошибки):
#include <oci.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define SERVICE_NAME "ORADB"
#define SERVICE_USER "basil"
#define SERVICE_PASSW "pupkinn"
int main()
{
OCIEnv* penv = NULL;
OCIError* perr = NULL;
OCIServer* pserv = NULL;
OCISvcCtx* psvc = NULL;
OCISession* psess = NULL;
OCITrans* ptrans = NULL;
OCIStmt* pstmt = NULL;
OCILobLocator* locator = NULL;
ub4 lobEmpty = 0;
unsigned short isNull = 0;
OCIDefine* pdefine = NULL;
/* Подключение к БД */
putenv("NLS_LANG=ENGLISH.UTF8");
OCIInitialize(OCI_DEFAULT, NULL, NULL, NULL, NULL);
OCIEnvInit(&penv, OCI_DEFAULT, 0, NULL);
OCIHandleAlloc(penv, (dvoid**)&psvc, OCI_HTYPE_SVCCTX, 0, NULL);
OCIHandleAlloc(penv, (dvoid**)&perr, OCI_HTYPE_ERROR, 0, NULL);
OCIHandleAlloc(penv, (dvoid**)&pserv, OCI_HTYPE_SERVER, 0, NULL);
OCIHandleAlloc(penv, (dvoid**)&psess, OCI_HTYPE_SESSION, 0, NULL);
OCIServerAttach(pserv, perr, (text*)SERVICE_NAME,
strlen(SERVICE_NAME), OCI_DEFAULT);
OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, pserv, 0, OCI_ATTR_SERVER, perr);
OCIAttrSet(psess, OCI_HTYPE_SESSION, (text*)SERVICE_USER,
strlen(SERVICE_USER), OCI_ATTR_USERNAME, perr);
OCIAttrSet(psess, OCI_HTYPE_SESSION, (text*)SERVICE_PASSW,
strlen(SERVICE_PASSW), OCI_ATTR_PASSWORD, perr));
OCISessionBegin(psvc, perr, psess, OCI_CRED_RDBMS, OCI_DEFAULT));
OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, psess, 0, OCI_ATTR_SESSION, perr));
/* Создание транзакции */
OCIHandleAlloc(penv, (dvoid**)&ptrans, OCI_HTYPE_TRANS, 0, NULL);
OCIAttrSet(psvc, OCI_HTYPE_SVCCTX, ptrans,
0, OCI_ATTR_TRANS, perr);
OCITransStart(psvc, perr, 2, OCI_TRANS_READWRITE);
/* Вставка пустого BLOB-значения */
OCIHandleAlloc(penv, (dvoid**)&pstmt, OCI_HTYPE_STMT, 0, NULL);
{
const char* sql = "INSERT INTO blob_tab(a) "
"VALUES(EMPTY_BLOB()) "
"RETURNING a INTO :1";
OCIStmtPrepare(pstmt, perr, (text*)sql, strlen(sql),
OCI_NTV_SYNTAX, OCI_DEFAULT);
}
OCIDescriptorAlloc(penv, (dvoid**)&locator, OCI_DTYPE_LOB, 0, NULL);
OCIAttrSet(locator, OCI_DTYPE_LOB, &lobEmpty, 0, OCI_ATTR_LOBEMPTY, perr);
OCIDefineByPos(pstmt, &pdefine, perr, 1, &locator, -1, SQLT_BLOB, &isNull,
NULL, NULL, OCI_DEFAULT);
OCIStmtExecute(psvc, pstmt, perr, 0, 0, NULL, NULL, OCI_DEFAULT);
OCIStmtFetch(pstmt, perr, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
/* Запись в BLOB */
{
ub4 amt = 10;
const char* data = "0123456789";
OCILobRead(psvc, perr, locator, &amt, 1, data, amt,
NULL, NULL, 0, SQLCS_IMPLICIT);
}
/* TODO: фиксация транзакции, закрытие соединения, освобождение ресурсов */
}