gpt4 book ai didi

c++ - 使用 OCILIB 调用带有输出变量的 Oracle 过程

转载 作者:行者123 更新时间:2023-11-28 08:16:18 25 4
gpt4 key购买 nike

我有一个具有以下签名的程序:

procedure countryExists(iCountryName in varchar2, oCount out integer)

当我使用 OCILIB 运行它时,我无法获得 oCount 的正确值。如果我将其注册为整数(使用 OCI_RegisterInt),我会收到错误消息:

ORA-03116: invalid buffer length passed to a conversion routine

如果我将它注册为一个字符串,它会运行,但 OCI_GetString 返回一个空指针并且 OCI_GetInt 返回 0(而不是预期的结果 1)。

测试代码为:

int init = OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT|OCI_ENV_CONTEXT);
OCI_Connection *cn = OCI_ConnectionCreate("mydb", "myuser", "mypass", OCI_SESSION_DEFAULT);
OCI_Statement *st = OCI_StatementCreate(cn);

int resultprepare = OCI_Prepare(st, "call mypackage.countryExists('BRAZIL', :oCount)");
//int registercount = OCI_RegisterString(st, ":oCount", 100);
int registercount= OCI_RegisterInt(st, ":oCount");
int executeresult = OCI_Execute(st);
OCI_Error *err1 = OCI_GetLastError();
const char *error1 = OCI_ErrorGetString(err1);
OCI_Resultset *resultset = OCI_GetResultset(st);
const wchar_t *valstr = OCI_GetString(resultset, 1);
int valint = OCI_GetInt(resultset, 1);
OCI_Error *err2 = OCI_GetLastError();
const char *error2 = OCI_ErrorGetString(err2);

例如,使用 PL/SQL Developer 运行该过程工作正常。

这是使用 OCILIB 调用过程的正确方法吗?

另请注意,我使用的是库的混合版本。

最佳答案

你不是在用 Java 编码......

正确的做法是:

OCI_Connection *cn;
OCI_Statement *st;
int count;

OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT|OCI_ENV_CONTEXT);

cn = OCI_ConnectionCreate("mydb", "myuser", "mypass", OCI_SESSION_DEFAULT);
st = OCI_StatementCreate(cn);

OCI_Prepare(st, "begin mypackage.countryExists('BRAZIL', :oCount); end;");
OCI_BindInt(st, ":oCount", &count);
OCI_Execute(st);

查看 OCILIB 文档和/或手册

文森特

关于c++ - 使用 OCILIB 调用带有输出变量的 Oracle 过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com