- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
20.提高ESQL/C程序的运行效率
第二十章
提高ESQL/C程序的运行效率
本章讲述如何提高程序的运行效率,例如,要重复执行SQL语句时怎样改进程序。
在本材料中引入了一些动态SQL专题的内容,有关动态SQL将在Advanced INFORMIX-ESQL/C课程中详细讨论。
可以通过编写C语句,并包括进来特殊的头文件和SQL语句,从而创建ESQL/C程序。然后,运行esql预编译器来处理该程序,esql接受要处理的代码,读入所有的SQL语句,并把它们翻译成C的代码。
正如在前面的章节提到过的那样,嵌入的SQL语句可以是所有的可交互式的SQL语句,例如,在INFORMIX-DBAccess中使用的SQL语句。嵌入的SQL语句也有一些是自己独有的,这些语句处理编译、游标和动态SQL。
当esql读到一条象WHENEVER的指令,它从代码中去掉该指令,并从该处开始捕获所说明的错误。
当esql读到有关游标操作的SQL语句,象OPEN等,它把这些语句简单翻译为对特定函数的调用。
当esql读到动态SQL语句,象PREPARE等,它把这些语句简单翻译为对特定函数的调用。
但是,当esql读到象INSERT、SELECT、UPDATE或DELETE之类的语句时,它在一个私有的、局部块中完成一系列的事情:
把SQL语句存放到一个字符数组中。
如果有的话,把所有的输入数据和输出数据有关的描述信息存储起来。
调用一个特定的函数来处理SQL请求。
可以浏览esql产生的C代码来查看这一点。
在程序运行时,SQL语句仅是作为字符串存在于内存中的某个区域。当esql预编译程序时,它产生一个指向该字符串的指针。(实际上,它建立起一个字符指针数组,每个指针指向一段SQL文本。)上面就是这样的一个存放SQL文本的例子。
在该例子中,注意到两个宿主变量被两个问号所代替(?):它们是实际数据的占位符。
为理解该替换,需要明白编译源代码的一个基本目的:为数据值提供地址信息。编写源代码时,使用符号来引用变量数据,把它们称为宿主变量。但是,程序运行时,对此计算机所能理解的唯一事情是数据的值和地址,它并不理解对于符号的引用。为从符号引用转换为对机器地址的访问,需要编译源程序。
从SQL语句得到的SQL文本不会有任何的符号内存引用(宿主变量)。在翻译的第3步,这一点你马上就能看到,一个特定的函数在程序运行时把该文本传递该数据库服务器。在运行时刻,没有诸如符号引用之类的东西,只有地址和数据的值。如果该函数传递的是对符号的引用,象$PhoneLc10,服务器试图把它解释为某些SQL对象的名称,从而导致错误。
这就是为什么要使用问号来代替宿主变量。
在程序运行时,SQL语句仅是以字符串的形式存在于内存中的某个位置,去掉了所有的对宿主变量的引用。
为了保证这些数据值的位置不会丢失,esql把它们的地址存放到一个特定的数组中。当我们到达第3步,即在数据库服务器执行SQL请求时,它需要这些地址。那时,我们只要传递一个指向该数组的指针。
在SQL语句中有两类数据要引用:送往服务器的数据,称为输入数据,以及从服务器送出来的数据,称为输出数据。esql区分这两种数据,把它们的地址存放到不同的数组。
数据种类 特定的数组 输入数据 _sqibind 输出数据 _sqobind 在下面的INSERT语句中:
$insert into customer ( phone, company )
values ( $PhoneLc10, $CompanyLc20 );
VALUES子句中的两个宿主变量给服务器提供输入数据,因此它们的地址存放到_sqibind数组中。
每个SQL语句同一个特定库中的某个函数相关联,该库在使用esql时自动链接到程序中。这些函数通过管道同数据库服务器通讯。
这些函数送给服务器两种不同的请求:
请求A:对SQL语句进行语法分析。
请求B:执行SQL语句。
在语法分析过程中,数据库服务器:
检查SQL语句的语法和语义的合法性
检查访问权限
如果需要的话,优化查询路径
如果服务器在这一步发现错误,它返回一个错误代号给调用函数,该函数接着设置SQLCODE的值;接着执行紧跟着SQL语句的下一条语句。在这一步没有对数据值的引用。
如果数据库服务器没有发现错误,它把“编译后的”以及优化了的SQL语句版本存放到它的数据空间里的某个结构中,并给调用函数返回一个成功完成代码0。该函数接着发送另一个请求给服务器:执行。此时,服务器需要对数据值的引用,以执行SQL语句。
常常要重复执行一条或多条SQL语句。这里是两个重复执行的例子:
把一个UPDATE语句放到一个函数里,并在程序中的不同位置调用该函数。
几百次的重复执行一段代码,每次从标准输入读一个记录,然后使用INSERT语句把记录插入数据库。
正如你
您可能关注的文档
最近下载
- the-new-age-of-invention高一英语新外研版必修三unit3课件.pptx VIP
- (2025)呼伦贝尔市入团积极分子考试题库(含答案).docx VIP
- HG∕T 5677-2020 石油炼制行业绿色工厂评价要求.pdf VIP
- 《基于三菱FX2N控制系统的自动剥线机设计》9500字(论文) .pdf
- 奔驰500系列发动机操作手册.pdf VIP
- 天津大学学生宿舍文明住宿承诺书.DOC VIP
- 2025年中国半乳甘露聚糖项目创业计划书.docx
- The new age of invention课件新外研版必修三unit3.pdf VIP
- 2024辽宁中考数学二轮专题复习 微专题 遇到角平分线如何添加辅助线(课件).pptx VIP
- xx集团粮食仓储及加工基地可行性研究报告.docx
文档评论(0)