首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得OCI_ATTR_SQLFNCODE *在* OCIStatementExecute()之前的语句类型?

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

Stack Overflow用户
提问于 2012-03-09 22:37:24
回答 1查看 420关注 0票数 1

我需要知道如何在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,则如果iters0 (正如文档所述),则OCI返回一个错误。

获取语句类型(SELECT与否)的有文档记录的方法是查询语句句柄的属性,如下所示:

代码语言:javascript
复制
ub2 statementType = 0;
OCIAttrGet(mystmt, OCI_HTYPE_STMT, (dvoid*)(&statementType), NULL, OCI_ATTR_SQLFNCODE, myerrhp);

不幸的是,在调用0之前,这个函数总是返回statementTypeOCIStmtExecute()

我遇到了第22次的麻烦。在调用OCIAttrGet()以获得语句类型以正确设置iters之前,必须调用iters。但是,在OCIStmtExecute()成功之前,我必须调用OCIAttrGet()

我已经尝试过两次调用OCIStmtExecute(),这是第一次将OCI_DESCRIBE_ONLY传递给最终参数(mode)。不幸的是,在这种情况下,OCIStmtExecute()仍然给出了与iters相关的错误。

(请注意:语句句柄mystmt已提前正确准备,成功地调用了OCIStmtPrepare2(),错误句柄myerrhp也已被正确分配。)

我做什么好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-23 11:27:18

使用OCI_ATTR_STMT_TYPE代替:它在OCIStmtPrepare之后就可用了,可以用来粗略地确定语句的类型(即。如果这是一个"select“语句)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9641925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档