如何在*OCIStatementExecute()之前获取语句类型OCI_ATTR_SQLFNCODE*?

如何在*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行 进入这些预定义的缓冲区,并根据需要预取更多

我需要知道如何在OCI中获取已准备语句句柄的语句类型

这个难题如下。如果语句不是
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”语句)