我试图在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。