Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与CLOB兼容的Pro-C缓冲区类型_C++_Oracle_Clob_Proc - Fatal编程技术网

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

C++ 与CLOB兼容的Pro-C缓冲区类型,c++,oracle,clob,proc,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一起工作。我将定位器的声明从OCIBLOCATOR更改为OCIBLOCATOR,然后绞尽脑汁试图找

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

信息是

PCC-S-02428, Buffer type is incompatible with LOB type,
在一行上写着:

EXEC SQL LOB READ :amount FROM :clob into :buffer;
这段代码是我试图修改与BLOB一起工作的代码,以改为与CLOB一起工作。我将定位器的声明从OCIBLOCATOR更改为OCIBLOCATOR,然后绞尽脑汁试图找出需要将缓冲区声明为什么(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*buffer)、大小数组声明、直接声明(例如,uvarchar buffer)以及有符号和无符号声明。对于缓冲区声明本身合法的所有情况,READ-INTO语句都无法使用此消息编译

实际上,将消息文本输入到google会让我看到一个Oracle页面,该页面只是简单地重述消息(而不是帮助我列出兼容的类型)。Oracle教程都关注BLOB,没有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
正如我前面提到的,完全相同的事情(除了声明一个OCIBlocator并将各种变量从blob_某物重命名为clob_某物)会编译和运行


不幸的是,我无法发布代码,因为它位于一个有气隙的系统上,文件传输的权限需要比我高出很多的权限的写入。

发现了问题所在:

我做了一件事

execsqlvar缓冲区是原始的(BUFFSIZ)

当缓冲区用于连接到blob时,这很好,但对于clob则没有关系。显然,您声明缓冲区为什么并不重要,但您不希望通过此调用将其变为原始


顺便说一句,如果在一个处理BLOB的方法中声明“buffer”,它在后续方法中仍然在Pro-C范围内,包括IS RAW调用——因此我在为处理CLOB编写的后续方法中使用了不同的名称。

发现了问题所在:

我做了一件事

execsqlvar缓冲区是原始的(BUFFSIZ)

当缓冲区用于连接到blob时,这很好,但对于clob则没有关系。显然,您声明缓冲区为什么并不重要,但您不希望通过此调用将其变为原始

顺便说一句,如果在一个处理BLOB的方法中声明“buffer”,那么在后续方法中它仍然在Pro-C范围内,包括IS RAW调用——因此我在为处理CLOB编写的后续方法中不得不使用不同的名称