如何在*OCIStatementExecute()之前获取语句类型OCI_ATTR_SQLFNCODE*?
我需要知道如何在OCI中获取已准备语句句柄的语句类型 这个难题如下。如果语句不是如何在*OCIStatementExecute()之前获取语句类型OCI_ATTR_SQLFNCODE*?,c,oracle,oracle10g,oracle-call-interface,C,Oracle,Oracle10g,Oracle Call Interface,我需要知道如何在OCI中获取已准备语句句柄的语句类型 这个难题如下。如果语句不是SELECT,则ocistExecute()-iters-的第四个参数不能是0,但如果语句是SELECT,则必须是0(并且定义不能提前完成)。来自OCISMTEXECUTE的OCI 10g文档: 对于非SELECT语句,此语句被删除的次数 已执行的等同于iters-rowoff 对于SELECT语句,如果iters为非零,则定义必须具有 语句句柄已完成。执行获取iters行 进入这些预定义的缓冲区,并根据需要预取更多
SELECT
,则ocistExecute()
-iters
-的第四个参数不能是0
,但如果语句是SELECT
,则必须是0
(并且定义不能提前完成)。来自OCISMTEXECUTE
的OCI 10g文档:
对于非SELECT语句,此语句被删除的次数
已执行的等同于iters-rowoff
对于SELECT语句,如果iters为非零,则定义必须具有
语句句柄已完成。执行获取iters行
进入这些预定义的缓冲区,并根据需要预取更多行
预回迁行计数。如果您不知道选择了多少行
语句将检索,并将iters设置为零
如果非SELECT语句的iters=0,此函数将返回一个错误
对于诸如SELECT*…
之类的语句,在从语句句柄获取descripe
信息之前,甚至不可能知道列是什么,而只有在调用ocisttexecute()
后,语句句柄才可用。(因此,不可能提前在语句句柄上执行defines
)因此,如果(未知)语句类型为SELECT
,我必须为iters
传递0
。但是,如果(未知)语句类型不是SELECT
,如果iters
是0
,则OCI将返回一个错误(正如文档所述)
获取语句类型(SELECT
或not)的文档化方法是查询语句句柄的属性,如下所示:
ub2 statementType = 0;
OCIAttrGet(mystmt, OCI_HTYPE_STMT, (dvoid*)(&statementType), NULL, OCI_ATTR_SQLFNCODE, myerrhp);
不幸的是,对于statementType
,此函数始终返回0
,直到调用ocisttexecute()
之后
我陷入了第二十二条军规的境地。我必须先调用ociattarget()
,然后才能调用ocisttexecute()
来获取语句类型,以便正确设置iters
。但是,我必须调用ocistTextExecute()
,然后ociattTarget()
才能成功
我尝试调用了两次ocisttexecute()
,第一次只传递了最后一个参数(mode
)的OCI\u descripe\u
)。不幸的是,ocisttexecute()
在本例中仍然给出与iters
相关的错误
(请注意:通过调用ocistmprepare2()
,语句句柄mystmt
已提前正确准备,并且错误句柄myerrhp
也已正确分配。)
我该怎么办?改用
OCI\u ATTR\u stm\u TYPE
:它在OCISMTprepare
之后可用,可用于粗略确定语句的类型(即,如果这是一个“select”语句)