2011-06-04 91 views
3

使用OCIStmtPrepare()OCIBindByName()时,是否有办法按名称进行绑定,然后将该绑定的位置作为intOCIStmtGetBindInfo()似乎没有做到这一点。谢谢!从OCI中的绑定名称获取绑定位置

+0

您可以在一个语句中多次重复一个命名变量,并使用一个'OCIBindByName()'调用为它们全部设置它。所以这可能代表多个位置参数,那么它会使用哪些位置?请参阅[OCI中的绑定概述](http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28395/oci05bnd.htm#i436225) – 2011-06-06 14:20:13

回答

2

似乎没有一种简单的方法来做到这一点。我尝试使用无证的绑定手柄使用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) 

将填补你found输出变量2(与2点的绑定信息的阵列),而:

begin insert into foo (bar, baz) values (:bar, :bar); end; 

将填补你found输出变量1(和阵列与1绑定的信息)。 尽管如此,在任何情况下,对OCIBindByName()的单个呼叫都会绑定。

+0

我认为你是对的,没有办法只在OCI内部进行。谢谢! – Gaius 2011-06-09 08:56:00