18在ESQLC程序中使用插入游标.docx
- 文档编号:23288659
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:8
- 大小:448.60KB
18在ESQLC程序中使用插入游标.docx
《18在ESQLC程序中使用插入游标.docx》由会员分享,可在线阅读,更多相关《18在ESQLC程序中使用插入游标.docx(8页珍藏版)》请在冰豆网上搜索。
18在ESQLC程序中使用插入游标
第十八章
在ESQL/C程序中使用插入游标
本章介绍在INFORMIX-ESQL/C程序中定义和使用插入游标。
有两种方法可以向数据库中添加记录:
一次添加一条记录或一次添加多条记录。
INSERT语句允许向数据库中插入一个记录。
如果把INSERT语句放在循环中,用户可以向数据库插入多条记录,但是,对于每一次循环INSERT语句只执行一次。
每次执行INSERT语句时,设置_sqibind结构,并把该结构包的内容送往数据库服务器,在那里进行I/O操作。
如果有许多的记录要添加到表中,送往数据库服务器的结构包的数量和I/O操作的数目可能极大地影响系统的性能。
由于这个原因,通常的INSERT语句无法提供一种对表进行多记录插入的灵活办法。
如果INSERT语句可以把多个记录存放到一个缓冲区中,然后把缓冲区(一个包)送往数据库服务器进行一次“大”的插入,则该问题就被解决了。
实际上,可以使用INFORMIX-ESQL/C的插入游标完成该项功能。
插入缓冲区在通过INFORMIX-ESQL/C设置时,是依赖于系统的,而且它的大小不能改变。
在一般情形里,它从1k和记录大小两者中取一大值。
同插入游标相关联的语句有五个:
●DECLARE
●OPEN
●PUT
●FLUSH
●CLOSE
这些语句将在后面讨论。
DECLARE语句用来同INSERT语句相关联。
如果有VALUES子句,它还绑定宿主变量的类型、大小和地址。
该语句必须出现在任何对游标的引用之前,如果没有这样做,编译时会出错或给出警告信息。
OPEN语句完成下面的工作:
●发送消息给服务器,让它检查INSERT语句中表和字段的合法性。
-是否有一个名称为manufact的表?
-要插入值的字段是否都属于该表?
-是否有权限插入记录?
-在数据段中打开插入缓冲区。
●如果游标已经打开,又对同一个游标执行OPEN语句,即试图重新打开游标,INFORMIX-ESQL/C写缓冲区中的内容,并重新初始化游标结构。
全局变量sqlca.sqlerrd[2]的值被设置为实际插入到数据库中的记录的数目。
●可能已经注意到用于INSERT语句的OPEN语句的语法,同用于所有三种类型的SELECT游标:
一般的、加锁的和滚动的一样。
使用PUT语句,可以把一个记录存放到INSERT缓冲区,以后再插入到数据库表中。
全局变量sqlca.sqlcode和sqlca.sqlerrd[2]指明每次PUT语句执行的结果。
●如果INFORMIX-ESQL/C仅把一个记录存放到插入缓冲区,它把sqlca.sqlcode和sqlca.sqlerrd[2]的值都设置为0。
●如果由于执行了PUT语句,使INFORMIX-ESQL/C进行一个FLUSH操作,并成功地把一组(整个缓冲区)记录插入到数据库中,则sqlca.sqlcode的值设置为0,而sqlca.sqlerrd[2]的值设置为所插入记录的数目。
●如果由于执行了PUT语句,使INFORMIX-ESQL/C进行一个FLUSH操作,并试图把整个缓冲区的记录插入到数据库中,但是操作不成功,则sqlca.sqlcode的值设置为负值(特别地,设置为错误信息的号码),而sqlca.sqlerrd[2]的值设置为成功插入到数据库中的记录的数目。
在上次成功插入记录之后的缓冲区中的记录被丢弃。
使用FLUSH语句使得INFORMIX-ESQL/C把缓冲区中的记录插入到数据库中,而不关闭游标。
●可以使用FLUSH语句强迫进行插入操作。
但是,无法通过不使用FLUSH语句来延迟插入,因为缓冲区满了,INFORMIX-ESQL/C会自动腾空缓冲区。
●全局变量sqlca.sqlcode和sqlca.sqlerrd[2]指明每次FLUSH语句执行的结果。
如果INFORMIX-ESQL/C成功地把缓冲区里的记录插入到数据库中,它把sqlca.sqlcode的值设置为0,而把sqlca.sqlerrd[2]的值设置为所插入记录的数目。
如果INFORMIX-ESQL/C试图把缓冲区里的记录插入到数据库中,但是操作不成功,它把sqlca.sqlcode的值设置为负值(特别地,设置为错误信息的号码),而把sqlca.sqlerrd[2]的值设置为成功插入到数据库中的记录的数目。
退出程序之前如果没有关闭游标,则缓冲区的内容不会写入到数据库中。
自从上次FLUSH操作(不论是显式的还是隐式的操作)以来写入到缓冲区中而且仍保存在里面的记录会丢失。
不要期望程序结束时会关闭缓冲区并把缓冲区中的内容写到数据库中。
CLOSE语句腾空缓冲区,并使INSERT游标和INSERT缓冲区失效。
缓冲区内存被释放。
使用FREE语句释放游标结构占用的空间:
$freeinsert_buf;
●全局变量sqlca.sqlcode和sqlca.sqlerrd[2]指明每次CLOSE语句执行的结果。
●INFORMIX-ESQL/C没有提供全局变量来记录由INSERT游标成功插入到数据库中的记录的数目。
如果想知道所插入记录的总数目,必须在程序中设置一个计数器,并在执行每次PUT语句时,增加计数器的值。
●在使用INSERT游标之前必须先用DECLARE语句来定义它。
●使用DECLARE语句定义游标后,用OPEN语句打开它。
●一旦打开了INSERT游标,就有了INSERT缓冲区,可以用PUT语句把数据放入INSERT缓冲区。
●FLUSH语句是可选择的,通常与条件语句一起使用。
●把数据插入到数据库完毕之后,使用CLOSE语句关闭INSERT游标,以确保所有存放在INSERT缓冲区里的数据被插入到数据库中,并释放INSERT缓冲区占用的空间。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 ESQLC 程序 使用 插入 游标