OCI編程高級篇(六) LOB定位符
訪問www.tomcoding.com網站,學習Oracle內部數據結構,詳細文檔說明,下載Oracle的exp/imp,DUL,logminer,ASM工具的源代碼,學習高技術含量的內容。
從這節開始我們來處理LOB數據的操作,LOB是Large Object的縮寫,是Oracle用于替換LONG和LONG RAW類型而設置的,目前LOB的存儲數據量最大達到了128T字節。隨著LOB使用越來越頻繁,LOB的操作也變得重要。LOB主要分為CLOB和BLOB兩種,分別用于存放字符數據和二進制數據。
LOB操作中有一個重要的概念是LOB定位符,顧名思義就是通過它找到LOB數據存儲的位置,由于LOB數據與LOB列數據是分開存儲的,所以Oracle在LOB列數據中存儲了LOB定位符,通過定位符再找到LOB數據存儲的位置。
在OCI中LOB定位符是一個指針,類型為OCILobLocator,它指向一個分配的空間,空間中包含了LOB定位的信息。所以在使用LOB定位符之前,要先分配定位符,用到函數為OCIDescriptorAlloc(),先看看函數的原型和參數。
sword OCIDescriptorAlloc ( const void *parenth,
void **descpp,
ub4 type,
size_t xtramem_sz,
void **usrmempp);
parenth是一個輸入參數,要分配描述符的父句柄,這里是環境句柄。
descpp是一個輸出參數,是一個指針的指針,返回描述符的指針。
type是一個輸入參數,指示返回描述符的類型,這里輸入OCI_DTYPE_LOB,返回LOB定位符。
xtramem_sz是一個輸入參數,隨描述符額外分配的內存大小。
usrmempp是一個輸出參數,返回用戶分配的額外內存的指針。
用OCIDescriptorAlloc()分配的描述符,需要用OCIDescriptorFree()函數釋放,不要錯用OCIHandleFree()函數。
sword OCIDescriptorFree ( void *descp, ub4 type );
descp是一個輸入參數,是描述符的指針。
type是一個輸入參數,是描述符的類型。
看一個分配LOB定位符的例子。
OCIEnv *envhp = NULL; int alloc_lob_locator(void){ sword rc; sb4 ec; OCILobLocator *locp; text errbuf[512]; /* 分配LOB定位符 */ rc = OCIDescriptorAlloc((const void *)envhp, (void **)&locp, OCI_DTYPE_LOB, 0, (void **)NULL); if (rc != OCI_SUCCESS) { OCIErrorGet(envhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR); fprintf(stderr, "OCIDescriptorAlloc() - [%d] %s\n", ec, errbuf); return (-1); } /* 釋放LOB定位符 */ rc = OCIDescriptorFree((void *)locp, OCI_DTYPE_LOB); if (rc != OCI_SUCCESS) { OCIErrorGet(errhp, 1, NULL, &ec, errbuf, 512, OCI_HTYPE_ERROR); fprintf(stderr, "OCIDescriptorFree() - [%d] %s\n", ec, errbuf); return (-1); } return (0); }
LOB定位符在分配之后,只能在查詢時才有用,這時可以通過查詢結果填充LOB定位符空間,使之與一個LOB字段關聯起來,然后才能再操作這個字段。但是如果想要插入一個LOB字段,分配后的LOB定位符由于沒有內容,是不能使用的,首先要把它變成一個空LOB定位符才行,也就是要初始化這個定位符。這一步要用到OCIAttrSet()函數,設置空LOB定位符的操作如下。
ub4 lob_empty = 0;
if (OCI_SUCCESS != check_oci_error(errhp,
OCIAttrSet((void *)(*locp), (ub4)OCI_DTYPE_LOB,
(void *)&lob_empty, (ub4)0, (ub4)OCI_ATTR_LOBEMPTY, errhp)))
return (-1);
這樣就創建好了一個空的LOB定位符,就可以通過OCI函數插入到一個LOB字段中了,然后通過查詢語句再把定位符與LOB字段關聯起來,就可以操作LOB字段了。那么不通過查詢關聯定位符和LOB字段可不可以呢?答案是不行。空LOB字段在插入時,Oracle要做一系列操作,才能生成真正的定位符數據,這個數據與空LOB定位符中的數據是不一樣的,所以通過空LOB定位符插入LOB字段后,不能用這個空LOB定位符直接操作LOB字段。
下一節我們看看怎樣插入LOB數據。

浙公網安備 33010602011771號