




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Informix ESQLC开发目录 1.INFORMIX产品介绍 2.INFORMIX-ESQL/C介绍 3.数据库stores5 4.在INFORMIX-ESQL/C中嵌入SQL语句 5.编译INFORMIX-ESQL/C程序 6.在INFORMIX-ESQL/C中使用简单变量 7.ESQL/C简单插入语句 8.ESQL/C程序中的SQL通讯区 9.ESQL/C程序中的异常检测 10.ESQL/C中单记录的检索和查询 11.ESQL/C程序中使用DECIMAL数据类型 12.ESQL/C中使用DATETIME和INTERVAL数据类型 13.ESQL/C中使用VARCHAR数据类型 14.
2、SQL游标概览 15.ESQL/C程序中使用滚动游标 16.ESQL/C中的数据库删除和修改操作 17.ESQL/C程序中使用更新游标 18.在ESQL/C程序中使用插入游标 19.在ESQL/C程序中使用BYTE和TEXT数据类型 20.提高ESQL/C程序的运行效率 21.在ESQL/C中有效使用滚动游标 22.控制数据库服务 23.动态SQL基本知识 24.使用动态描述区域的动态SQL 25.使用SQLDA的动态SQL 第一章 INFORMIX产品介绍 目标:描述Informix产品体系结构;理解Informix体系结构的优点;了解Informix系列产品。本章讨论Informix的双进
3、程体系结构和这种体系结构的优越性,还将概要介绍Informix提供的产品。Informix提供了为开放系统开发和实现信息管理应用的先进产品。核心产品包括应用开发和应用工具,数据库服务器以及中间件。所有的产品都基于ANSI标准的SQL。 Informix的一系列众多的应用开发和应用工具适用于各种不同的应用类型和开发组织。 Informix的服务器和中间件产品提供的解决方案包括从分布式数据库、客户机/ 服务器到与主机的连接。Informix提供了两类数据库服务器选择,从而能够调整系统,符合已有的资源和技术储备。 快速容错服务器,可以进行联机事务处理方面的应用(INFORMIX-OnLine) 低维
4、护服务器,适用于中、小规模的应用环境(INFORMIX-SE)Informix工具可以运行于绝大多数的主流操作系统,包括UNIX、DOS、Macintosh、OS/2、NeXT和其它操作系统。Informix产品使用双进程体系结构,它把用户的前端应用代码和后端数据库服务器隔离。 应用开发工具或客户端,提供构建和运行应用程序的用户接口。 数据库服务器,进行所有的数据处理工作,包括数据的存储和检索。工业标准SQL用于传送从客户端应用到Informix服务器的数据请求。在双进程体系结构中,客户机和服务器可以位于同一台机器上或是通过网络相连接的不同的机器上。当两个进程运行于不同的机器上时,称之为客户机
5、/服务器体系结构。上图表示Informix产品如何构成双进程体系结构。客户机/服务器的体系结构有几个优点: 性能隔离前端和后端进程,使得可以为特定的任务来优化软、硬件。 灵活性使用双进程体系结构,前端开发工具可以适用于不同的Informix服务器。这样做,可以使用户选择最适合于自己的应用环境的服务器。从长远的观点来看,开放式的体系结构使得来自于不同厂商的前端开发工具和服务器可以协同工作。 节省费用可以选择适合于应用程序规模的硬件,从而达到最优的性能/价格比。 可移植性应用程序易于移植到不同的机器上。 INFORMIX-4GL是一个基于工业标准SQL的第四代数据库编程语言,它可以用来创建复杂的、
6、灵活的、易修改的、健壮的应用。INFORMIX-4GL快速开发版INFORMIX-4GL Rapid Development System使得不必使用C编译器和C的链接程序就能编译和运行INFORMIX-4GL程序,并且极大地减少了编译的时间。使用INFORMIX-4GL Rapid Development System和使用INFORMIX-4GL开发的应用程序完全兼容。INFORMIX-4GL交互调试器INFORMIX-4GL Interactive Debugger同INFORMIX-4GL Rapid Development System一同工作,它可以使开发人员在应用程序运行时,在一
7、个有分割窗口的屏幕上观看和测试INFORMIX-4GL代码。INFORMIX-4GL/RF INFORMIX-4GL/RF使得程序员开发的应用程序可以透明地通过无线电频道(RF)同远端的操作计算机通讯。INFORMIX-4GL/GX INFORMIX-4GL/GX给使用INFORMIX-4GL编写的程序提供一个图形的、基于窗口的执行环境,它与使用Informix的基于字符的4GL产品兼容。INFORMIX-TP/ToolKit INFORMIX-TP/ToolKit允许INFORMIX-4GL程序员创建同事务管理器相连接的OLTP应用程序。INFORMIX-4GL Forms INFORMIX
8、-4GL Forms是一个代码生成器和窗口绘制器,它使得开发人员可以快速地生成定制的数据录入程序。INFORMIX-Menus INFORMIX-Menus是一个菜单系统开发工具,它使得程序员可以为Informix数据库应用快速地创建菜单。INFORMIX-SQL INFORMIX-SQL是一个基于SQL的关系数据库管理系统,它是为程序员同时也是为非程序员设计的。它提供了工具来帮助用户快速创建功能完全的应用程序,而不必具有编程语言方面的知识。INFORMIX-ESQL INFORMIX-ESQL(嵌入式SQL)产品使得程序员可以从C、COBOL、FORTRAN或Ada程序中直接访问和操作数据库
9、。使用它们来编写数据处理程序所化的时间只占使用传统的编程语言所化时间的一小部分。INFORMIX OpenCase产品Informix OpenCase Program努力提供一个灵活、开放式的系统体系结构,使得可以连接由Informix或其它厂商提供的各种计算机辅助软件工程(CASE)工具。INFORMIX-OpenCase/ToolBus INFORMIX-OpenCase/ToolBus是Informix OpenCase Program的一部分。OpenCase/ToolBus 是用于UNIX操作系统的一个集成的软件开发环境。它支持许多“同类中最好的”计算机辅助软件工程(CASE)工具
10、。INFORMIX-OpenCase/Encapsulator INFORMIX-OpenCase/Encapsulator使得用户不用修改源代码就可以向OpenCase/ToolBus中加入用户自己开发的、第三方厂商提供的和已有的UNIX工具,从而扩展和定制OpenCase/ ToolBus应用开发环境,INFORMIX-4GL for ToolBus INFORMIX-4GL for ToolBus是用于OpenCase/ToolBus开发环境的图形化的4GL产品,它与整个INFORMIX-4GL家族完全兼容。Wingz Wingz是一个易于使用的高性能的电子表格。它包括一个功能强大的类似
11、于英语的编程语言HyperScript,可以用来创建图形化的应用。INFORMIX-SE INFORMIX-SE服务器适用于需要多用户的数据库服务器的环境,但是高的可用性(availability)和OLTP级别的性能不是关键。它适用的环境是多用户共享数据库,运行中、小规模的应用。INFORMIX-SE基于事实上的工业标准的UNIX的文件访问方法,即Informix C-ISAM。C-ISAM C-ISAM是与X/Open兼容的C函数库,用来创建和管理索引顺序文件。INFORMIX-OnLine INFORMIX-OnLine是Informix的高性能、容错的、OLTP数据库服务器。OnLin
12、e允许在数据库的字段中存放和使用二进制大对象(BLOBs),从而扩展了数据处理使之可以处理多媒体信息。它还允许分布式数据库应用。INFORMIX-TP/XA INFORMIX-TP/XA把INFORMIX-OnLine同事务监控器相连接而支持全局事务。全局事务是涉及到多个数据库以及可能是多个计算机系统的事务。INFORMIX-OnLine/Secure INFORMIX-OnLine/Secure提供INFORMIX-OnLine的功能,另外增加了功能以支持多层次安全性应用。INFORMIX-OnLine for NetWare INFORMIX-OnLine for NetWare是用于Ne
13、tWare 3.11 客户机/服务器环境的高性能、OLTP数据库服务器。它提供高可用性、数据完整性和多媒体数据管理能力,而不必有复杂的数据库管理过程。INFORMIX-OnLine/Optical INFORMIX-OnLine/Optical把光盘子系统的海量存储能力同OnLine的多媒体支持能力相结合。它提供高层次的应用编程接口(API),使得WORM光盘子系统可以直接同OnLine环境接口。Informix连接产品允许把应用工具和数据库服务器的处理分布到客户机和服务器上。这种体系结构意味着应用处理可以下载到客户工作站上,而数据库引擎运行在服务器上。这样做,可以获得高的性能和减少网络开销。
14、下面介绍Informix的连接产品。INFORMIX-NET INFORMIX-NET是客户机/服务器软件,它使得客户应用或工具通过网络同远端的数据库服务器相连接。INFORMIX-NET一边必须同客户应用或工具相连,另一边还必须同INFORMIX-SE服务器一起运行在一台主机上。INFORMIX-STAR INFORMIX-STAR同INFORMIX-OnLine运行在同一台主机上,它为INFORMIX-OnLine提供的功能等同于INFORMIX-NET为INFORMIX-SE提供的功能。另外,INFORMIX-STAR 提供分布式数据库功能,允许用户操作多个位于不同网络位置的数据库,就如
15、同是在使用同一个数据库。第二章 INFORMIX-ESQL/C简介目标:了解INFORMIX-ESQL/C的特点;比较INFORMIX-EXQL/C同其它产品的不同;了解INFORMIX-ESQL/C产品和在INFORMIXDIR目录下的示例文件;设置INFORMIX-ESQL/C的环境变量。本章介绍INFORMIX-ESQL/C产品和它在Informix提供的应用程序开发工具集中所处的地位。介绍INFORMIX-ESQL/C的总体概貌,使你了解该产品在应用开发过程中所起的作用。介绍随INFORMIX-ESQL/C产品所带的示例数据库。简短地回顾一下特定于INFORMIX的环境变量,使用户可以
16、设置自己的环境来使用INFORMIX-ESQL/C。INFORMIX-ESQL/C是一个应用开发工具,它使得构建应用程序的C程序员拥有一个访问Informix数据库的接口。开发人员使用库、头文件和预编译器来直接在C程序中嵌入SQL语句。INFORMIX-ESQL/C具有众多的组织成库形式的例程来帮助用户 使用所有的SQL数据类型 解释状态消息 使用Informix子进程INFORMIX-ESQL/C有时简称为ESQL/C。在本教程中,几乎无一例外地使用后一种称呼。在使用ESQL/C之前,必须设置好下面的环境变量:INFORMIXDIR INFORMIX- ESQL/C所位于的目录PATH 执行
17、程序的搜索路径用户可以在系统提示符下或在.profile( B shell )文件或 .login( C shell )文件中设置这些变量。如果是在系统提示符下设置环境变量,则用户每次登录时要重新设置它们。如果是在 . profile或 .login文件中设置,则用户每次登录时,环境变量会自动被设置。使用Bourne shell时,设置环境变量如下:INFORMIXDIR=usr/informix/; export INFORMIXDIR PATH=$INFORMIXDIR/bin:$PATH; export PATH 使用C shell时,设置如下:setenv INFORMIXDIR /u
18、sr/informix setenv PATH $INFORMIXDIR/bin:$PATH 当用户运行INFORMIX-OnLine时,还应当把环境变量SQLEXEC设置为$INFORMIXDIR/ lib/sqlturbo,把环境变量TBCONFIG设置为合适的值。运行INFORMIX-NET、INFORMIX-STAR或INFORMIX-OnLine时,可能还有其它的环境变量需要设置。ESQL/C与Informix其它的应用开发工具相比较稍有不同。与INFORMIX-4GL、INFORMIX-SQL、WINGZ和SMART- WARE不同的是,ESQL/C 提供给开发人员的界面不是菜单驱
19、动的。ESQL/C同C代码、INFORMIX-SQLs Ace或Perform一起使用。ESQL/C预处理器ESQL/C的一个主要部件就是它的预处理器。预处理器在把C的源代码送给C编译器处理之前,把ESQL/C代码转换成C代码。预处理命令从命令行启动,启动时可以有各种不同的参数来说明源文件、预期的结果文件,等等。ESQL/C预处理器将在其它章节里详细讨论。在本培训手册中,预处理器的名字为esql。ESQL/C带了一个示例数据库stores5,该数据库中存放的是一个虚构的运动器材批发商有关的信息。当示例数据库被创建时,使用ESQL/C的示例源代码也随之被创建。在练习使用ESQL/C之前,用户应当
20、建立自己的stores5数据库的拷贝。1. 创建一个子目录,用来存放ESQL/C的例子源文件,输入如下:%mkdir demo %cd demo 2.现在,输入下面的命令(输入时,把DbName替换成你所使用的stores5数据库名): %esqldemo5 DbName 当用户使用自己的stores5数据库拷贝时,可以进行任意的修改。如果用户想刷新数据库拷贝,只要再次运行esqldemo5,将删除现有的数据库拷贝,并按初始的情形下创建一个新的数据库拷贝。第三章 数据库Stores5目标:使用数据库Stores5.本章讲述stores5数据库的概貌。 Informix产品提供了一个示例数据库s
21、tores5,用户可以在系统提示符下输入dbaccessdemo5 来创建该数据库。stores5数据库中存放的信息是有关一个虚构的运动器材批发商的,该批发商给美国西部的一些商店提供运动器材。数据库中存放有九张表,如上面所列。附注:用户可以输入dbaccessdemo5 name,以其它的名字来创建stores5数据库。数据类型指明一张表中的每列要存储的信息的种类。系统提供的几种数据类型如下: CHAR 存放字母、数字和符号的任意组合。NUMBER 存放五种数值数据类型中的某种数值。SERIAL 存放由INFORMIX-SQL赋值的连续的整数。DATE 存放日期。MONEY 存放现金数额。DA
22、TE-TIME 存放日期和时间。INTERVAL 存放表示一段时间的值。VARCHAR 存放可变长度的字符数据,仅使用必须的磁盘空间。TEXT 一种二进制大对象(BLOB),实际上它可以存放任何种类的文本数据。TEXT字段通常存放备忘录、手稿、商业文档,等等。BYTE 一种二进制大对象(BLOB),它以一种无区分的字节流形式来存放任意种类的二进制数据,通常是保存的电子表格、程序的装载模块、数字化的声音模板,等等。附注:VARCHAR、TEXT和BYTE数据类型仅在使用INFORMIX-OnLine时才有。要获取同数据类型有关的更多的信息,请查阅The Informix Guide to SQL
23、:Reference。本页和后续页讲述stores5数据库中的九张表,指明每张表中的各个字段的含义和所赋予的数据类型。表Customer中存放的是28家商店的有关信息,这些商店从批发商那里购进运动器材。客户信息由下面的十个字段组成: 客户的帐户号(customer_num) 公司法人代表的名字(fname, lname) 公司的名称(company) 地址(address1, address2, city, state, zipcode) 电话号码(phone) 数据类型:下面是表Customer中的字段和字段的数据类型的列表。customer_num serial fname char(15
24、) lname char(15) company char(20) address1 char(20) address2 char(20) city char(15) state char(2) zipcode char(5) phone char(18) 表orders中存放的是客户的定单,定单信息由下面的十个字段组成: 定单号(order_num) 预定日期(order_date) 客户号(customer_num) 交付指示(ship_instruct) 是否要储备货(backlog) 客户订购的次序号(po_num) 交付信息(ship_date, ship_weight, ship_
25、charge) 客户付款日期(paid_date) 数据类型下面是表orders中的字段和字段的数据类型的列表。order_num serial order_date datecustomer_num integer ship_instruct char(40)backlog char(1) po_num char(10)ship_date date ship_weight decimal(8, 2)ship_charge money(6,2) paid_date date 表items用来记录定单中的项。例如,有些定单中只包含有一项,有的定单可能有四项之多。项的有关信息由下面的六个字段组成:
26、 项的编号(item_num) 定单号(order_num) 项的仓库号(stock_num) 生产厂家编号(manu_code) 预订的数量(quantity) 单价与数量的乘积(total_price) 数据类型:下面是表items中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。item_num smallint order_num integerstock_num smallint manu_code char(3)quantity smallint total_price money(8,2) 表stock用来表示批发商销售的仓库,仓库的信息由下面的六个字段组成: 仓库号(st
27、ock_num) 生产厂家的编号(manu_code) 项的描述(description) 单价(unit_price) 项的定购单位(unit) 单位的描述(unit_descr) 数据类型:下面是表stock中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。stock_num smallint manu_code char(3)description char(15) unit_price money(6,2) unit char(4)unit_descr char(15) 表manufact由下面的三个字段组成,存放的是生产厂家的有关信息: 生产厂家名字的三字母缩写(manu_co
28、de) 生产厂家的全名(manu_name) 订货交付的时间期限(lead_time) 数据类型:下面是表manufact中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。manu_code char(3)manu_name char(15) lead_time interval day(3) to day 表state有两个字段: 州的合法缩写(code) 州的全名(sname) 数据类型:下面是表state中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。 Code char(2) Sname char(15) 表catalog用来表示仓库中每一项的信息,它由下面六个字段组成:
29、 存货目录号(catalog_num) 仓库号(stock_num) 生产厂家编号(manu_code) 项的描述(cat_descr) 项的用字节表示的图片(cat_picture) 图片下面的标签(cat_advert) 数据类型:下面是表catalog中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。catalog_num serial stock_num smallintmanu_code char(3) cat_descr textcat_picture byte cat_advert varchar(255, 65) 注意:catalog表仅当SQLEXEC环境变量的值设置为
30、$INFORMIX/lib /sqlturbo时才被创建,在INFORMIX-SE的数据库中不创建该表。表cust_calls中的字段用来存放客户的电话记录: 客户号(customer_num) 打电话的时间(call_dtime) 接电话的人(user_id) 指明电话类别的编码(call_code) 电话内容的描述(call_descr) 解决该问题的答复时间(res_dtime) 为解决问题而采取的措施的描述(res_descr) 数据类型:下面是表cust_calls中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。customer_num integer call_dtime
31、datetime year to minute user_id char(18) call_code char(1)call_descr char(240) res_dtime datetime year to minute res_descr char(240) 表call_type中存放的是所接到电话的类别的有关信息。 指明电话类别的编码(call_code) 电话类别的描述(code_descr) 数据类型:下面是表call_type中的字段和字段的数据类型的列表。该表的主键以粗体字印刷。 call_code char(1)code_descr char(30) 练习 问题标明每张表的主
32、键和外键,指明这些表是如何连接起来的。使用后续页中的示例数据来帮助解题。 第四章 在INFORMIX-ESQL/C程序中嵌入SQL语句目标:在C程序中嵌入SQL语名;识别访问SQL数据库的C变量;理解ESQL/C程序结构。本章学习在INFORMIX-ESQL/C环境中工作的基本知识。任何可以交互式输入的SQL语句,例如,通过DB-Access来交互式执行,都可以在C程序中使用。但是,在使用格式上可能有点不一样。例如,在C程序中使用SELECT语句比交互式使用时要求略多一些处理。有一些SQL语句只能在程序中使用,不能交互式执行,在其它章节中将会有这样的例子。在C程序中嵌入SQL语句时,要记住下面
33、的规则: 为预编译器指明SQL语句在SQL语句之前用美元符号($)或ANSI的标准关键字EXEC SQL来标明。尽管用户可以在C代码中混用这两种标注方法,但是,为了便于维护,一般不推荐这样做。另外,不要忘记在SQL语句的最后加上分号( ; )。 SQL语句可以有变量,变量可以出现在交互式SQL语句中常数可以出现的任何位置。这种在可执行的SQL语句中的变量称为宿主变量(host variable),将在后面讨论它。 可以在能够使用C的可执行语句的任何地方使用可执行的SQL语句。 宿主变量,即是C语言中的普通变量,它们可以出现在交互式SQL语句中常数所在的任何位置上。当在SQL语句中使用宿主变量时
34、,必须把它们同SQL语句中的名称相区分,这样做使得预编译器能够识别出哪些标识符是宿主变量。为从嵌入式的SQL语句中区分出宿主变量,给宿主变量加上美元符号($)作前缀。如果用户愿意的话,也可以使用ANSI标准中规定的分号( : )来作前缀。(在本手册中,我们将使用美元符号来作标识。)这里是一些例子: UPDATE语句中的SET子句,如 $update stock set unit_price = $NewPriceLd; INSERT语句中的VALUES子句,如 $insert into stock values( $StockG_t ); UPDATE、DELETE和SELECT语句中的WHE
35、RE子句,例如:$update stock .where manu_code = $MfcodeLc; $delete from orders where order_num = $OrdNoLl; 宿主变量是普通的C变量。既然它们是普通的C变量,必须把它们说明和定义成某种类型,就象任何别的C变量一样。宿主变量可以定义为这些类型中的任何一种 简单类型象integer, double, 等等。 结构 数组象其它的C变量一样,可以在定义宿主变量的时候初始化它们。但是,因为ESQL/C预编译器要在编译SQL语句之前知道宿主变量的存在和类型,所以必须为预编译器标明宿主变量的定义。可以使用美元符号($)
36、作为定义的前缀来为预编译器标明宿主变量的定义,或者,把定义部分用下面这对语句括起来EXEC SQL BEGIN DECLARE SECTION EXEC SQL END DECLARE SECTION 关于宿主变量和它们的引用有几点其它因素需要考虑。宿主变量和SQL数据库对象(数据库、表、字段、约束、过程,等等)可以同名,即使是在同一个SQL语句中。例如,下面的语句是正确的$update customer set zipcode = $zipcode where customer_num = $customer_num; esql预编译器区分字母的大小写,即对字母的大小写敏感。例如,下面的两个
37、宿主变量是不同的,它们访问的是不同的内存$char manuCodeC44; $char manucodec44 最后,任何使用$为前缀来定义的变量都可以在标准的C表达式中使用。例如,下面的gets() 对宿主变量的引用是合法的$char DBNameC1111; gets(DBNameC11);$database $DBNameC11; 当SQL语句之外使用宿主变量时,不能以$为前缀来引用,否则,C编译器编译时报错。当数据从数据库中取出,送到一个ESQL/C应用程序时,取得的数据应存放到与SQL数据类型兼容的数据类型中。同样,当数据从应用程序存放到数据库中时,数据类型也应当兼容。如果用户没有
38、说明兼容的宿主变量类型,有些情形可以进行自动的类型转换;如果无法转换,则返回一个错误信息。当接收数据区太小时,如果丢失的是有效数字,则返回错误,如果是字符,则返回警告信息。检测和处理这些错误和警告将在其它的章节中讨论。上图列出了SQL数据类型和它们对应的C的宿主变量类型。CHAR、SMALLINT、INTEGER、SMALLFLOAT、FLOAT、SERIAL和DATE这些SQL数据类型都有相对应的C的数据类型。但是,DECIMAL、MONEY、DATETIME、INTERVAL和VARCHAR必须定义特别的ESQL/C数据类型来与之相对应。后续的章节将全面地描述这些数据类型。SQL/C在宿主
39、变量定义时支持类似C的typedef表达式,如上面所示。但是,它们必须以$符号为前缀,ESQL/C不处理没有$符号为前缀的typedef语句。在上面的例子中,$typedef创建了一个SMALLINT类型来作为短整型(short int)使用,然后再定义一个StockNumLs变量,类型为SMALLINT。本例用同样的方法定义了长整型(long int)的等价的SQL数据类型DATE。不能使用$typedef来把多维数组或联合(union)定义成宿主变量类型。使用C的typedef表达式时要小心,因为esql不会展开它们。可以把结构定义为INFORMIX-ESQL/C的宿主对象。上例把stoc
40、k_t定义为一个结构模板,然后,使用该模板定义了两个结构变量StockG_t和ItemG_t。可以使用嵌套的结构。在可执行的SQL语句中,可以把结构作为一个整体来使用或引用它的任一部分。当把结构作为整体来使用时,INFORMIX ESQL/C预编译器把结构的引用展开成对它的各个部分的引用的列表。例如:$insert into stock(stock_num, manu_code) values($StockG_t); 等价于$insert into stock(stock_num, manu_code) values($StockG_t.StockNumS, $StockG_t.ManuCod
41、eC); 可以把数组定义为INFORMIX-ESQL/C的宿主对象。上例把BufLapc定义为一个字符指针的数组,而且,它还把UnitSal定义为一个长整型的数组。在定义数组时,必须使用一个整形值来说明数组的大小。在可执行SQL语句中,可以 引用数组的任何一个元素。 对于CHAR类型的数组,可以仅引用数组名。 对于其它类型的数组,不能仅引用数组名。 在定义宿主变量时,可以使用普通的C的初始化表达式来进行初始化。但是,对于字符类型的表达式有一个例外:字符串不能有 分号 INFORMIX-ESQL/C的关键字 预编译器不检查C语法的正确性;它只是把初始化表达式传递给C编译器,由C编译器来检查这类错
42、误。有关宿主变量的作用域范围的规定同一般的C变量一样。 宿主变量是automatic(局部的),除非显式地定义为external或static。 在一个函数中定义的宿主变量对于该函数来说是局部的。 函数中的局部宿主变量使得定义在函数外部的同名的变量不可见。 在同一个模块中不能多次定义同一个宿主变量。 为确保局部宿主变量对于它所定义的块(block)来说是局部的,使用一对组合的符号 $ 和 $ 来开始和结束块。ANSI标准不支持 $ 和 $ ,在5.0版中可以使用简单的括弧对, 和 。块最多可以嵌套16层。INFORMIX-ESQL/C提供了许多的头文件。(参见上面的列表。)这些文件中定义了许多
43、对象,用户的程序可能会用到它们。这些文件位于$INFORMIXDIR目录的子目录incl/esql 下。每一个头文件将在后续的合适的章节讨论。可以在程序中包含进一个或多个头文件来简化编程,例如,下面这条语句包含进sqlca头文件$include sqlca; 在程序中包含进sqlca头文件,可以发现诸如数据库服务器执行SQL语句是否成功,等等。当预编译器看到$include,它将读入文件sqlca.h,并把它插入到用户的代码中。在后续某章中,你将看到如何使用该头文件中的一些结构来检测SQL语句的执行状态。$include在其它章节中讨论。在访问数据库表和给表添加记录之前,必须激活表所在的数据库
44、。为激活一个数据库使它成为当前打开的数据库,使用DATABASE语句DATABASE 必需的关键字DatabaseName 想要选择的数据库的名字DatabaseName可以是一个指明数据库的标识符、一个存有数据库名字的字符串或指向这样的一个字符串的指针。当为INFORMIX-SE说明数据库时,如果该数据库既不在当前目录也不在DBPATH环境变量所说明的目录,则必须在DATABASE关键字之后跟上一个字符串常数或一个宿主变量,该变量存放的是数据库的完整路径名(不包括.dbs后缀)。使用CLOSE DATABASE语句来关闭当前的数据库。CLOSE DATABASE是必需的关键字。在头一个例子中
45、stores是数据库名。如果使用的是INFORMIX-OnLine,则该数据库在由环境变量TBCONFIG指明的OnLine的当前实例中。如果使用的是INFORMIX-SE,则该数据库位于当前目录或DBPATH环境变量中存放的目录。在第二个例子中,stores5是数据库名。该数据库既不在当前目录也无法通过DBPATH环境变量来访问。宿主变量DbNameLc80中存放的是数据库的完整路径,路径由stcopy函数拷贝到变量中。尽管可以这样做,但是,在程序中通过编程来获取一个完整的路径名并不是一个好的作法。回答上面的问题。(答案见19页) 开始编写一个应用程序:它打开stores5数据库用来访问。给
46、出:1. 一个设置完好的环境,包含有预设的环境变量,这样用户可以使用ESQL/C预编译器和一个INFORMIX-OnLine实例。 2. vi编辑器。 3. 用于不同任务的样例C代码见下页。 目标:1. 使用提供的编辑器,创建一个新的名为stock_main.ec的源文件。 2. 使用下页的样例C程序作为模板,可以任意拷贝想要的代码。 3. 提示用户输入要访问的数据库的名字,把键盘输入存放到合适的变量中。 4. 在适当的SQL语句中使用该变量来打开要访问的数据库。 5. 输入下面的命令来编译程序: esql stock_main.ec -o stock 6. 输入stock来运行程序。实习1-
47、示例C程序stock_main.ec $include sqlca;main() $char DbNameLc19; printf( "Enter name of database: " ); gets( DbNameLc ); /*Put an SQL statement here to open the database*/ if( SQLCODE = 0 ) printf( "Database %s is now open.n", DbNameLc ); else printf( "Error in opening database: %
48、dn", SQLCODE );exit( 0 ); 答案 练习答案第15页1. 1. 必须为预编译器标明SQL语句,让它把SQL语句转换成C代码,这样,C编译器才能理解。 2. 2. 除非一条语句是以“$”开头,否则ESQL/C预编译器将不会处理它。如果语句以“$”开头,预编译器将把前缀“$”去掉,把语句中的所有的宿主变量转换成C 的变量。 如果在SQL语句之外即在一般的C语句中给变量加上“$”前缀,预编译器将不会去掉“$”,而是把带有$前缀的变量转交给C编译器,这样就会出错。所以,唯一使用带$前缀变量的地方是在SQL语句中。练习1-示例C程序stock_main.ec $inclu
49、de sqlca;main() $char DbNameLc19;printf( "Enter name of database: " ); gets( DbNameLc ); $database $DbNameLc; if( SQLCODE = 0 ) printf( "Database %s is now open.n", DbNameLc );else printf( "Error in opening database: %dn", SQLCODE );exit( 0 ); 第五章 编译INFORMIX-ESQL/C程序本章介
50、绍使用INFORMIX-ESQL/C预编译器的基本知识。学完本章,你可以:1.把其它文件合并到你自己的源代码中。2.指定条件来编译SQL语句。3.使用INFORMIX-ESQL/C来编译程序。 4.明白make实用程序的基本用法。 当使用INFORMIX-ESQL/C预编译器来预处理源文件时,它把所标明的SQL语句转换成C的代码。当然,要使用$符号作前缀或用EXEC SQL关键字把SQL语句包括起来,给预编译器指明SQL语句的存在。INFORMIX-ESQL/C仅当源文件具有“.ec”后缀时才作这类的转换。INFORMIX-ESQL/C把编译结果存放到与源文件同名但后缀是“.c”的一个文件中。
51、例如,预编译myfile.ec产生文件myfile.c,源文件内容myfile.ec不变。INFORMIX-ESQL/C有取舍地把新产生的C代码送给C编译器处理。可以在程序的任何地方使用标准的C的注释符号“/* */”。在包含有SQL语句的行中,可以使用ANSI标准的SQL注释符号双短横线(-)。INFORMIX-ESQL/C预编译器忽略双短横线右边的所有的文本。如下例,$delete - has no orders from customer; 该DELETE语句是不完整的,编译时出错,因为FROM子句是注释的一部分。但是,在下面的例子中$delete from customer - has
52、 no orders 该 DELETE语句是完整的,编译时完全正确。上图显示了语法正确的注释。用户可以在自己的程序中包含进其它的源文件。例如,你或许想把所有的全局变量的定义放到一个源文件中,然后,通过一个预编译指令把它们自动包含进来。如果该源文件不包含有SQL语句,则可以使用标准的C的预编译语句#include。INFORMIX-ESQL/C预编译器忽略所有的#include语句。但是,如果要包含的文件中有SQL语句,必须使用下面的INFORMIX-ESQL/C预编译语句之一,把filename替换成要包含的文件的名字$include filename; exec sql include fi
53、lename; 在上图中,INFORMIX-ESQL/C预编译器在当前目录中查找,并读入pgm_global包含文件。使用这种方式来包含文件最多可达八层。在$INFORMIXDIR/incl/esql目录中有九个头文件,可以在INFORMIX-ESQL/C源文件中使用它们。这些头文件将在适当的章节中讨论。预编译器查找$include语句中的文件名时,按下面的次序来查找目录:1. 当前目录 2. $INFORMIXDIR/incl/esql目录 3. /usr/include目录如果找到文件的话,就把文件内容插入到当前文件的include语句处。如果filename是路径名,则必须把路径名用双引
54、号括起来。可以在INFORMIX-ESQL/C代码中使用下面的条件编译语句 $define 把编译时的某个值赋予一个名字。$undef 取消定义的名字。$ifdef 检测名字是否存在,如果存在的话,处理后续的语句。$ifndef 检测名字是否存在,如果不存在的话,处理后续的语句。$elseif 进入$ifdef或$ifndef条件的else部分,并检测另一个$ifdef。$else 进入$ifdef或$ifndef条件的else部分。$endif 结束$ifdef或$ifndef条件。在上例中,可以看到有一条SQL语句被嵌入到$ifdef语句。如果使用标准的C的预编译指令#ifdef,则无法完
55、成这项工作。$define语句仅能定义符号或整常数,不支持字符串常数或参数宏的定义。当C程序中包含有SQL语句时,在使用C编译器编译之前,必须使用esql来预编译每个文件,把SQL语句翻译成普通的C代码。为预处理和编译这样的一个文件,给它的名字后面加上后缀.ec,然后使用esql命令来处理。esql预编译具有.ec后缀的文件,把编译后的结果存放到具有.c后缀的文件中,然后把控制传递给已有的C编译器。一旦C编译器编译并生成了目标文件,它将链接所需要的标准库和INFORMIX-ESQL/C库。在上面的例子里,使用-o选项说明编译的结果文件为demo2.ece。如果不使用-o选项,则可执行文件使用缺省的名字a.out。C的源文件和ESQL/C源文件不要使用同样的名称。例如,如果创建了一个全名为customer.ec的程序和一个全名为cust
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重症动脉瘤性蛛网膜下腔出血管理共识(2023)解读 2
- 2025年度航天器导航系统研发与联合试验合同
- 2025年事业单位工勤技能-北京-北京军工电子设备制造工一级(高级技师)历年参考题库含答案解析
- 跨行业员工培训计划制定与实施模板
- 2025年公共安全管理与应急处理考试试卷及答案
- 公共安全课件
- 铅蓄电池的全球市场趋势分析
- 蜜饯生产环境微生物监控报告
- 【2024年】山东省枣庄市辅警协警笔试笔试预测试题(含答案)
- 健身服务创新效果评估与分析报告
- 2025医学基础知识试题(附答案)
- 生产调度月度工作汇报
- 2025贵州水矿控股集团有限责任公司综合管理岗位招聘48人笔试历年参考题库附带答案详解
- 2025年中国农业银行新疆生产建设兵团分行春季招聘41人笔试模拟试题及答案详解1套
- 产品供货进度计划及保障措施
- T-GDLC 025-2025 温室气体 产品碳足迹 量化方法与要求 水泥
- 2026届高考语文总复习(第1轮)第三部分 古代诗文阅读知识手册(常见文言虚词(18个)用法归类)
- 医学检验尿常规解读与分析
- GB/T 9945-2025热轧球扁钢
- 西藏建筑业用工合同范本
- 软件销售业绩考核方案
评论
0/150
提交评论