将64位数字Oracle传递给C++ DLL库
我建立了一个Oracle数据库。在写入期间,触发事务触发器,执行外部C dll函数。以下是函数:将64位数字Oracle传递给C++ DLL库,c++,c,oracle,C++,C,Oracle,我建立了一个Oracle数据库。在写入期间,触发事务触发器,执行外部C dll函数。以下是函数: create or replace FUNCTION KOSARServerTrigDelMultiClients ( ipaddr IN VARCHAR2, datazone in VARCHAR2, client_id IN NUMBER, trans_id IN BINARY_INTEGER, cosar_keys IN VARCHAR2, flags IN BINARY_INTEGE
create or replace FUNCTION KOSARServerTrigDelMultiClients ( ipaddr IN VARCHAR2, datazone in VARCHAR2,
client_id IN NUMBER,
trans_id IN BINARY_INTEGER, cosar_keys IN VARCHAR2, flags IN BINARY_INTEGER) RETURN BINARY_INTEGER AS LANGUAGE C LIBRARY COSAR_DLL_LIB NAME "KOSARTrigDelMultiClient" PARAMETERS ( ipaddr, ipaddr LENGTH, datazone, datazone LENGTH, cosar_keys, cosar_keys LENGTH, trans_id, client_id,flags);
注意,client_id的类型是number,它可以保存64位整数
下面是C函数的外观:
extern "C" _export int KOSARTrigDelMultiClient(
const char* cstr_cacheServerAddress,
int cacheServerAddress_len,
const char* cstr_datazone,
int datazone_len,
const char* cstr_key,
int key_len,
int trans_id,
long long client_id,
int flags)
{
// do something
}
问题是:我在C中获得的client_id值与Oracle函数的输入不匹配。比如说,
Oracle函数的输入客户端id值:4653565745324456
我在C函数中得到的客户机id值:78607336
如何修复代码,使C++函数可以从Oracle中获得64位输入。我被困了好几个小时。谢谢!对不起,我的英语不好。我很确定当你的C函数应该使用OCINumber*client\u id时,不会太长。数字类型不是64位整数,而是固定的或浮点数。您使用的是Oracle C++库?看看OCINumberFromInt。这应该对你有用。我又读了一遍你的问题。你真的需要二进制整数吗?尝试使用OCINumber作为传递值。若您需要数字作为标志持有者,那个么也许您应该将用户RAWx转换为字节[]。如果您使用64位Oracle,并且无法将64位整数传递给外部过程,则应联系Oracle支持部门。谢谢您的评论。我试图使用oci图书馆的OCINumber*。当我使用include时,编译器无法检测头。我的临时解决方案是把长数作为字符串VARCHAR,然后用C++代码将其转换成长。