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

Pro-C buffer types compatible with a CLOB

本文关键字:Pro-C 缓冲区 类型 CLOB      更新时间:2023-10-16

我试图在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,然后绞尽脑汁试图弄清楚我需要将缓冲区声明为什么(无符号字符缓冲区[ BUFFSIZ ] 为 BLOB 工作)。

正如它现在的情况:

clob 声明如下:

OCIClobLocator *clob;

缓冲区为:

#define BUFFSIZ 1000000
unsigned char buffer[ BUFFSIZ ];

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

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

我找到的最接近答案的东西是在堆栈溢出上(点赞! 这个问题:使用 C 和嵌入式 SQL 在 Oracle 中选择 CLOB

来自有相同问题的其他人。 他声称通过从 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 确实可以编译和运行。

不幸的是,我无法发布代码,因为它位于气隙系统上,并且文件传输的权限需要比我高得多的权力。

找出问题所在:

我做了一个

EXEC SQL VAR buffer IS RAW( BUFFSIZ );

当缓冲区用于与 blob 接口时,这很好,但不适用于 clob。 显然,将缓冲区声明为什么并不重要,但是您不想通过此调用使其为RAW。

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