人大金仓数据库KingbaseES——OCI处理SQL语句的过程概述

关键字:

客户端编程接口、OCI、SQL

1.SQL语句在OCI中的处理过程

SQL语句在OCI接口中的处理过程分为语句准备、绑定占位符、执行语句、描述查询列表项、定义输出变量与获取查询结果。其中,后三个步骤只针对查询操作。

file

2.OCI中的语句准备

SQL和PLSQL语句通过使用语句准备调用和必要的绑定调用进行准备以便执行,由OCIStmtPrepare2()调用完成,并且会将先前分配的语句句柄传递给此调用。这是一个本地调用,没有任何和服务器之间的交互。在调用之后,可在语句句柄上调用OCIAttrGet( ),获取语句句柄中attrtype参数,从而得到当前语句的 OCI_ATTR_STMT_TYPE。SQL语句共有7种OCI_ATTR_STMT_TYPE,PLSQL有4种。

一个准备好的请求通过重新联系语句句柄和服务器各自的服务上下文句柄可以在多个服务器上执行。建立新的关联时,当前服务上下文和语句句柄之间的关联信息都会丢失。

3.OCI接口中的名称和位置绑定

多数DML语句和条件查询语句中都含有具体数据,因此在每次执行时都需要重新编译。为解决这一问题,提出占位符的概念,用来标记SQL语句中必须提供详细数据的位置。而绑定是在占位符名称和程序变量的地址(还有程序变量的数据类型和长度)之间建立关联。

在名称绑定中,语句中的每一个占位符都有一个名称与其关联,同样,在位置绑定中,每一个占位符都与语句中的位置对应。

4.OCI接口中的SQL语句执行

OCI中调用OCIStmtExecute( )执行SQL语句,在数据库中进行相应的操作。在执行查询时,从目标数据库中接收与查询规则匹配的数据,并将数据库中的存储格式转换为特定的主机语言格式,存储在特定的输出变量或者缓冲区中,执行其他操作时,返回数据库的执行结果。OCIStmtExecute( )还提供了确保多个服务上下文在同一个快照上提交数据的能力,其实现原理为:获取snap_out参数的内容并将其作为下一个OCIStmtExecute( )执行的snap_in参数。值得注意的是,及时前后两个调用使用的是相同的快照,一个服务上下文中的未提交数据也不会对另外的服务上下文可见。

5.OCI接口中的描述查询列表项

OCI应用程序在处理查询时,需要获取有关描述查询列表中的更多信息,包含有关查询列表的数据类型和列长度,这是定义查询结果的输出变量所必须的。描述有显式和隐式两种。显式描述要求应用程序调用特定函数从服务器获取描述信息。OCI_DESCRIBE_ONLY设置为OCIStmtExecute( )的参数时,为显式描述,不会执行该语句,但会返回查询列表的描述。而OCIDescribeAny( )调用的显式描述获取有关模式对象的信息,而不是查询列表。隐式描述允许程序在执行语句之后获取查询列表信息作为语句句柄的属性,不进行特定的描述调用。在执行SQL语句之后,有关查询结果的列和数据类型的信息会用做语句句柄的属性,可通过OCIParamGet( )与OCIAttrGet( )得到。

6.OCI接口中定义查询的输出变量

在处理数据查询请求时,需要将在数据库中检索到的数据返回到应用程序中,因此必须定义输出变量或者输出变量数组用于存储查询结果,这是决定查询结果在何处以何种形式存储的必要步骤。

7.OCI接口中获取查询结果

当查询语句执行结束之后,需要调用OCIStmtFetch( )或者OCIStmtFetch2( )来获取查询结果。其中,OCIStmtFetch2( )支持可滚动游标。如果输出变量的定义是在查询语句执行之前,则iters参数指定的数据行数直接提取到定义的输出缓冲区中。

注:可滚动游标scrollable cursors

(1) 标准游标:始终从开始方向向结束方向移动,每fetch一次,向结束方向移动一次,一条记录只能被访问一次,再次访问该记录只能关闭游标后重新打开。

(2) 可滚动游标:使游标指针在记录集之间灵活移动,使每条记录都可以被反复访问的一种游标。

可滚动游标的移动方向包含next(向结束方向移动一条),prior(向开始方向移动一条),first(回到第一条),last(移动到最后一条),absolute value_spec(定向检索指定位置的行,value_spec是由1到当前记录集的最大值),relative value_spec(相对当前记录向前或者向后移动,value_spec为正向结束方向移动,为负向开始方向移动)。

可滚动游标移动时需要判断是否到结束位置或者到起始位置,两种处理方式:①设置边界,判断是否到EOF位置(最后一条记录的后面)或者BOF位置(起始位置的前面);②不设置边界,通过whenever not found语句设置检测。

游标的作用:用于对查询数据库所返回的记录进行有序或者无序的遍历,以便进行相应的操作。OCI中使用的都是可滚动游标。Oracle数据库的DML操作不支持可滚动游标,如果查询列表的数据类型为LONG,则游标不能设置为可滚动的。客户端数据预取缓存的大小受OCI_ATTR_PREFETCH_ROWS与OCI_ATTR_PREFETCH_MEMORY两个参数控制。 分为静态游标和REF游标,静态游标是在编译时知道其select语句的游标,REF游标(引用游标)是在查询语句运行时才能确定的游标,结合游标变量使用。相比于标准游标,使用可滚动游标会消耗更多的服务器资源,造成更长的响应时间。

对于可滚动游标,OCIStmtExecute( )有一个特定的执行模式——OCI_STMT_SCROLLABLE_READONLY,语句句柄默认是不可滚动的,只能向结束方向遍历OCI_FETCH_NEXT,因此在每次使用之前都要重新设置。语句句柄中指示结果集中当前位置的的OCI_ATTR_CURRENT_POSITION属性只能通过OCIAttrGet( )获取。对于不可滚动游标,OCIStmtFetch2( )调用时OCI_ATTR_ROW_COUNT属性表示结果集中所有数据的行数,对于可滚动游标,OCI_ATTR_ROW_COUNT表示获取到用户缓冲区的最大行数。对于可滚动和不可滚动游标,语义句柄中的OCI_ATTR_ROWS_FETCHED属性表示最后一次fetch调用或者执行时用户缓冲区成功获取到的数据行数。

推荐使用OCIStmtFetch2( ),也可用于不可滚动游标,但如果使用的是OCI_DEFAULT 或者 OCI_FETCH_NEXT之外的任何方向,可能会引发错误。如果使用OCIStmtFetch2( ),将nrows参数设置为0,游标会失效。

可滚动游标调用OCIStmtExecute( ) 之后,再调用OCIStmtFetch2( ),使用OCI_FETCH_LAST获取结果集的大小,如果结果集占用的存储空间太大,设置OCI_ATTR_PREFETCH_ROWS为结果集的20%,并设置OCI_PREFETCH_MEMORY提升性能表现。 更多信息,参见https://help.kingbase.com.cn/v8/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值