我正在升级我们的应用程序以使用最新的Oracle即时客户端库(linux-x64 v21.1.0.0.0(,我遇到了一个以前从未见过的新异常。
OCI-30757: Message 30757 not found; product=RDBMS; facility=OCI
它发生在调用我们类型的readSQL
方法之一中的oracle::occi::getVector
期间:
void MyType::readSQL(AnyData& stream)
{
mId = stream.getNumber(); // oracle::occi::Number
oracle::occi::getVector(stream, mNames); // std::vector<std::string>
}
为了支持新的occi版本,我们需要对readSQL
方法进行一些更改吗?
这是调用堆栈:
oracle::occi::SQLException::SQLException(oracle::occi::SQLExceptionImpl*)@plt
oracle::occi::SQLExceptionCreate(void*, int)
oracle::occi::ErrorCheck(int, OCIError*)
oracle::occi::getVector(oracle::occi::AnyData const&, std::vector<std::string, std::allocator<std::string> >&)
MyDataType::readSQL(MyDataType * const this, oracle::occi::AnyData & stream)
MyDataType::readSQL(void * ctx)
libclntsh.so.21.1!kodpunp
libclntsh.so.21.1!kokoupkl
kokoicvtgen
kosimgconv
kosicvt
libclntsh.so.21.1!kosibegin
libclntsh.so.21.1!kpctos
ttca2p
ttcacs
ttcdrv
nioqwa
upirtrc
kpurcsc
kpuexec
OCIStmtExecute
oracle::occi::StatementImpl::doOCIExecute()
oracle::occi::StatementImpl::do_execute()
oracle::occi::StatementImpl::executeUpdate(std::string const&)
main(int argc, char ** argv)
我甚至不知道它为什么在这里调用readSQL
,SP不会返回那种类型的对象,而且SP在崩溃之前甚至没有执行。
这在occi-libs的v11中工作得很好:readSQL
没有被调用,SP被执行,一切都很好。
编译器也更新了吗?正在使用哪个版本的编译器?
嗯。您正在使用哪个libocci共享库?默认的libocci.so仅与g++4.x STL兼容。
OCCI未通过gcc10认证。当然不是默认的libocci。但是你可以尝试使用一个新的库来处理g++5/6/7/8。它被命名为libocci_gcc53.so.21.1,这是您在安装常规客户端(21c(时看到的,而不是即时客户端。