与CLOB兼容的Pro-C缓冲区类型

时间:2017-05-25 22:03:42

标签: c++ oracle clob proc

我试图在Pro-C中使用CLOB,但几乎无论我尝试使用缓冲区数据类型,预处理器都告诉我它不兼容。

消息是

PCC-S-02428, Buffer type is incompatible with LOB type,

它在一行上写着:

EXEC SQL LOB READ :amount FROM :clob into :buffer;

此代码是我尝试修改与BLOB一起使用的代码,而不是使用CLOB。我将定位器的声明从OCIBlobLocator更改为OCIClobLocator,然后我试图弄清楚我需要将缓冲区声明为(unsigned char buffer [BUFFSIZ]为BLOB工作)。

现在坐在那里:

clob声明如下:

OCIClobLocator *clob;

和缓冲区是:

#define BUFFSIZ 1000000
unsigned char buffer[ BUFFSIZ ];

我尝试过char,int,double,long。 ulong_varchar,short,utext,uvarchar,varchar在各种指针组合中(例如,short *缓冲区),大小的数组声明,直接声明(例如,uvarchar缓冲区),以及有符号和无符号。对于缓冲区声明本身合法的所有情况,READ INTO语句无法使用此消息进行编译。

实际上将消息文本输入谷歌会引导我进入一个简单重述消息的Oracle页面(而不是实际列出兼容类型的帮助)。 Oracle教程都专注于BLOB,没有CLOB的例子。

我发现最接近答案的是Stack Overflow(kudos!)。这个问题:Selecting CLOB in Oracle using C and embedded SQL

来自其他有同样问题的人。他声称通过从PRO-C的命令行调用中删除CHAR_SET = STRING参数来解决它。问题是,Pro-C在这里甚至没有意识到存在这样的选项......所以我无法删除它,因为我没有使用它。 (我试图在那里指出这一点,没有意识到我在滥用这个论坛而且它被删除了......我向所有必须清理我的混乱的人道歉。)

我的Pro * C / C ++版本是11.2.0.1.0

我正在运行的选项是

PARSE=NONE CODE=CPP CPP_SUFFIX=cpp MODE=ORACLE LINES=YES THREADS=YES

正如我之前提到的,完全相同的事情(除了声明一个OCIBlobLocator并将各种变量从blob_something重命名为clob_something之外,它确实可以编译和运行。

我很遗憾无法发布代码,因为它是在空气污染的系统上进行的,文件传输的许可将比我更强大的功能。

1 个答案:

答案 0 :(得分:0)

发现问题所在:

我做了一个

EXEC SQL VAR缓冲区IS RAW(BUFFSIZ);

当缓冲区用于连接blob时很好,但不适用于clob。显然,你将缓冲区声明为什么并不重要,但你不想通过这个调用使它成为RAW。

顺便提一下,如果你在一个处理BLOB的方法中声明“buffer”,它在后续方法中仍然处于Pro-C范围内,包括IS RAW调用 - 所以我不得不在我编写的后续方法中使用不同的名称用于处理CLOB。