我需要知道如何在OCI中获得准备好的语句句柄的语句类型。
具体情况如下。OCIStmtExecute()的第四个参数-- iters --如果语句不是SELECT,则不能是0,但是如果语句是SELECT (定义不能提前完成),则必须是0。来自OCIStmtExecute的OCI 10g文档
对于非SELECT语句,执行该语句的次数等于iters - rowoff。
对于SELECT语句,如果iters为非零,则必须对语句句柄执行了定义。执行会根据预取行数将行提取到这些预定义的缓冲区中,并预取更多行。如果不知道SELECT语句将检索多少行,请将iters设置为零。
如果非SELECT语句为iters=0,则此函数返回一个错误。
对于像SELECT * ...这样的语句,在从语句句柄获取describe信息之前不可能知道列是什么,只有在调用OCIStmtExecute()之后才可用。(因此,不可能提前对语句句柄执行defines。)因此,如果(未知)语句类型为0,则必须为iters传递SELECT。但是,如果(未知)语句类型不是SELECT,则如果iters是0 (正如文档所述),则OCI返回一个错误。
获取语句类型(SELECT与否)的有文档记录的方法是查询语句句柄的属性,如下所示:
ub2 statementType = 0;
OCIAttrGet(mystmt, OCI_HTYPE_STMT, (dvoid*)(&statementType), NULL, OCI_ATTR_SQLFNCODE, myerrhp);不幸的是,在调用0之前,这个函数总是返回statementType的OCIStmtExecute()。
我遇到了第22次的麻烦。在调用OCIAttrGet()以获得语句类型以正确设置iters之前,必须调用iters。但是,在OCIStmtExecute()成功之前,我必须调用OCIAttrGet()。
我已经尝试过两次调用OCIStmtExecute(),这是第一次将OCI_DESCRIBE_ONLY传递给最终参数(mode)。不幸的是,在这种情况下,OCIStmtExecute()仍然给出了与iters相关的错误。
(请注意:语句句柄mystmt已提前正确准备,成功地调用了OCIStmtPrepare2(),错误句柄myerrhp也已被正确分配。)
我做什么好?
发布于 2012-11-23 11:27:18
使用OCI_ATTR_STMT_TYPE代替:它在OCIStmtPrepare之后就可用了,可以用来粗略地确定语句的类型(即。如果这是一个"select“语句)。
https://stackoverflow.com/questions/9641925
复制相似问题