使用OCILIB使用输出变量调用Oracle过程

时间:2011-10-04 19:05:25

标签: c++ oracle oci

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

procedure countryExists(iCountryName in varchar2, oCount out integer)

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

  

ORA-03116:传递给转换例程的缓冲区长度无效

如果我将其注册为字符串,则会运行,但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调用程序的正确方法吗?

另请注意,我正在使用该库的混合版本。

1 个答案:

答案 0 :(得分:1)

你不是用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文档和/或手册

文森特