【问题标题】:Getting a bind position from a bind name in OCI从 OCI 中的绑定名称获取绑定位置
【发布时间】:2011-06-04 13:04:02
【问题描述】:

当使用OCIStmtPrepare()OCIBindByName() 时,有没有办法通过名称进行绑定,然后将该绑定的位置作为int 获取? OCIStmtGetBindInfo() 似乎没有这样做。谢谢!

【问题讨论】:

  • 您可以在一个语句中多次重复一个命名变量,并通过一个 OCIBindByName() 调用为所有变量设置它。所以这可能代表多个位置参数,那么它会使用哪些位置?见Overview of binding in OCI

标签: c oracle oracle-call-interface


【解决方案1】:

似乎没有一种简单的方法可以做到这一点。我尝试在绑定句柄上使用 OCIAttrGet() 使用未记录的(因为我在帮助文档中找不到它,但它在 oci.h 标头中)OCI_ATTR_HANDLE_POSITION

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;

将用 1 填充您的 found 输出变量(以及包含 1 绑定信息的数组)。 尽管如此,对OCIBindByName() 的一次调用将在任何一种情况下都绑定。

【讨论】:

  • 我认为您是对的,仅在 OCI 内无法做到这一点。谢谢!
猜你喜欢
  • 2018-04-05
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多