簡體   English   中英

如何使用 setDataBuffer() 讀取 OCCI 中的 LOB

[英]How to read LOBs in OCCI using setDataBuffer()

使用應用程序管理的數據緩沖區 (setDataBuffer()) 時,從 Oracle 讀取 LOB 的正確方法是什么?

所有 Oracle 文檔都討論了使用 getBlob() 使用 LOB 進行 OCCI 編程,並單獨討論了使用 setDataBuffer() 的高性能。 但是 setDataBuffer() 文檔從不討論 LOBS。

我們在 15 年前想出了一些辦法,並使用 OCI 調用來讀取 ResultSet::next() 之后的 blob。 它自 Oracle 10 和 12 以來一直有效。但是當我們嘗試移植到 Oracle 19.2 時,該實現似乎已損壞。 此遺留代碼中沒有代碼更改...只是嘗試使用 19.2 進行構建。

請將演示/示例安裝到使用過的客戶端中並在 $ORACLE_HOME/rdbms/demo 或 $ORACLE_HOME/oci/demo 中搜索 occiclob.cpp 並使用 readBuffer / writeBuffer 參見

https://docs.oracle.com/cd/B10501_01/appdev.920/a96583/cciaadem.htm

/**
 * populating the clob;
 */
void populateClob (Clob &clob, int size)
throw (SQLException)
{
Stream *outstream = clob.getStream (1,0);
char *buffer = new char[size];

memset (buffer,'H', size);
outstream->writeBuffer (buffer, size);
char *c = (char *)"";
outstream->writeLastBuffer (c,0);
delete (buffer);
clob.closeStream (outstream);
}

/**
 * printing the clob data as integer stream
 */
void dumpClob (Clob &clob, int size)
throw (SQLException)
{
Stream *instream = clob.getStream (1,0);
char *buffer = new char[size];
memset (buffer, NULL, size);

instream->readBuffer (buffer, size);
cout << "dumping clob: ";
for (int i = 0; i < size; ++i)
  cout << (char) buffer[i];
cout << endl;

delete (buffer);
clob.closeStream (instream);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM