使用C和嵌入式SQL在Oracle中选择CLOB [英] Selecting CLOB in Oracle using C and embedded SQL

查看:95
本文介绍了使用C和嵌入式SQL在Oracle中选择CLOB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

也许这里有人可以帮助我;我的想法用光了.

Perhaps somebody here can help me; I've run out of ideas.

我尝试在Oracle中包含CLOB的表上实现select语句.这是表的定义:

I try to implement an select statement on a table containing a CLOB in Oracle. This is the definition of the table:

PQUE
 ID                    NOT NULL NUMBER(13)
 PGA_ID                NUMBER(13)
 WS_CODE               NUMBER(5)
 OPERATION             VARCHAR2(30)
 RF_NR                 NUMBER(13)
 STATUS                NUMBER(5)
 SENDER                NUMBER(5)
 EMPFAENGER            NUMBER(5)
 START_ZEIT            TIMESTAMP(6)
 DATEN                 CLOB

我的SELECT语句看起来是这样的:

My SELECT-Statement looks this way:

void pap_pque_select(long        *sql_ptr,
                     PQUE_RECORD *pque_ptr)
{
   OCIClobLocator *clob=NULL ;
   long           bufsize=4294967295, start=1, i=0 ;
   long           old_size, new_size=1 ;
   char           buffer[2048] ;

   EXEC SQL ALLOCATE :clob ;
   EXEC SQL
      SELECT   PQUE.ID,
               PQUE.PGA_ID,
               PQUE.WS_CODE,
               NVL(PQUE.OPERATION, ' '),
               PQUE.RF_NR,
               PQUE.STATUS,
               PQUE.SENDER,
               PQUE.EMPFAENGER,
               TO_CHAR(PQUE.START_ZEIT, 'YYYYMMDDHH24MISSFF2'),
               NVL(PQUE.DATEN, EMPTY_CLOB())
        INTO   :(pque_ptr->pque_id),
               :(pque_ptr->pga_id),
               :(pque_ptr->ws_code),
               :(pque_ptr->operation),
               :(pque_ptr->rf_nr),
               :(pque_ptr->status),
               :(pque_ptr->sender),
               :(pque_ptr->empfaenger),
               :(pque_ptr->start_zeit),
               :clob
        FROM   PQUE
       WHERE   PQUE.ID = :(pque_ptr->pque_id) ;
   *sql_ptr = sqlca.sqlcode ;

   if (sqlca.sqlcode == 0)
   {
      ds_trim(pque_ptr->operation) ;
      do
      {
         if (i++ == 0)
            EXEC SQL LOB READ :bufsize FROM :clob AT :start INTO :buffer ;
         else
            EXEC SQL LOB READ :bufsize FROM :clob INTO :buffer ;
         if (sqlca.sqlcode == 0 || sqlca.sqlcode == 1403)
         {
            old_size = new_size ;
            new_size += bufsize ;
            if (pque_ptr->daten == NULL)
               pque_ptr->daten = calloc(new_size, sizeof(char)) ;
            else
               pque_ptr->daten = realloc(pque_ptr->daten,               
                                         new_size*sizeof(char)) ;
            memcpy(pque_ptr->daten+old_size-1, buffer, bufsize) ;
            pque_ptr->daten[new_size-1] = '\0' ;
         }
      }
      while (sqlca.sqlcode == 0) ;
   }
   EXEC SQL FREE :clob ;

   *sql_ptr = sqlca.sqlcode ;

   return ;
}

使用Pro-C-Precompiler,我得到了错误:

Using the Pro-C-Precompiler, I get the error:

第59行第67列,文件pap_pque_sel.pc中的语义错误: EXEC SQL LOB读取:bufsize FROM:clob AT:start INTO:buffer; ................................................... ................ 1 PCC-S-02428,缓冲区类型与LOB类型不兼容

Semantic error at line 59, column 67, file pap_pque_sel.pc: EXEC SQL LOB READ :bufsize FROM :clob AT :start INTO :buffer ; ..................................................................1 PCC-S-02428, Buffer type is incompatible with LOB type

任何人都有一个主意,为什么char [...]应该与CLOB不兼容?我在数据库中与其他CLOB一起使用了相同的构造,并且运行良好.

Anybody got an idea, why char[...] should be incompatible with CLOB? I sed the same construct with other CLOBs in my database, and it worked fine.

预先感谢您 最好的祝福 约尔格(Jörg)

Thank you in advance Best regards Jörg

推荐答案

我终于找到了问题所在.所有其他PRO-C模块都使用选项CHAR_SET = STRING进行编译.这不适用于LOB.删除该模块的选项时,我可以对其进行编译,并且效果很好.

I finally found the problem myself. All the other PRO-C modules are compiled using the option CHAR_SET=STRING. This does not work with LOB. When removing the option for this module, I could compile it, and it works fine.

最诚挚的问候 约尔格(Jörg)

Best regards Jörg

这篇关于使用C和嵌入式SQL在Oracle中选择CLOB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆