使用OCIStmtPrepare()
和OCIBindByName()
时,有没有办法按名称进行绑定,然后将该绑定的位置设为int
? OCIStmtGetBindInfo()
似乎没有这样做。谢谢!
答案 0 :(得分:2)
似乎没有一种简单的方法可以做到这一点。我尝试使用未记录的(因为我在帮助文档中找不到它,但它在oci.h头文件中)OCI_ATTR_HANDLE_POSITION
在绑定句柄上使用OCIAttrGet()
:
ub4 bpos = 0;
OCIBind *bindp;
OCIAttrGet(bindp, OCI_HTYPE_BIND, &bpos, 0, OCI_ATTR_HANDLE_POSITION, errhp);
不幸的是,这似乎适用于您在位置上绑定的绑定句柄,但对于按名称绑定的任何内容返回0。
因此,您似乎必须使用OCIStmtGetBindInfo()
调用来填充绑定变量名称数组,然后通过比较绑定来遍历它以查找每个命名绑定的位置命名为绑定变量名称数组中的值(其值将为大写):
sb4 found = 0;
text* bvns[100];
ub1 bvnls[100];
text* invs[100];
ub1 invls[100];
ub1 dupls[100];
OCIBind* bhnds[100];
OCIStmtGetBindInfo(stmthp, errhp, (ub4)100, (ub4)1, &found, bvns, bvnls, invs, invls, dupls, bhnds);
for (unsigned int col = 0; col < found; col++)
{
printf("%p is bound to name: %s", bhnds[col], bvns[col]);
}
关于语句中多个占位符的一个有趣的事情是,如果您的语句是匿名块,它的行为会有所不同。那就是:
insert into foo (bar, baz) values (:bar, :bar)
将使用2填充您的found
输出变量(以及包含2个绑定信息的数组),而不是:
begin insert into foo (bar, baz) values (:bar, :bar); end;
将您的found
输出变量填充为1(以及包含1个绑定信息的数组)。
尽管如此,对OCIBindByName()
的单个调用将在两种情况下都绑定。