1、编号:TN-070101001 TIENON 数据库培训教程INFORMIX 嵌入式 SQL 编程2007 年 1 月,V 1.00从 INFORMIX 的 CHAR 型转成 integer 型rstod(char* str,double* dblval)字符串转 doublerstoi(char* str,int* intval)字符串转 intrstol(char* str,long* lngval)字符串转 longTienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-2Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至
2、上 3-3目 录1、 引言 31.1、 读者对象 .31.2、 内容简介 .31.3、 课程时间 .31.4、 课程目标 .32、 INFORMIX 嵌入式 SQL 语法 32.1、 概念 .42.2、 ESQL 程序的组成 42.2.1、 程序首部 .42.2.2、 程序体 .62.3、 ESQL 语法 62.3.1、 连接数据库 .62.3.2、 关闭连接 .72.3.3、 运行 SQL 命令 .72.3.4、 使用宿主变量 .82.3.5、 游标的使用 102.3.6、 动态 SQL 112.3.7、 错误处理 122.3.8、 事务处理 132.3.9、 程序实例 133、 INFOR
3、MIX 嵌入式 SQL 编译 153.1.1、 预编译器 153.1.2、 makefile 编写方法 154、 练习 15Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-41、 引言Tienon 是一家专业从事金融软件行业、服务于行业客户的专业软件公司,公司产品包括分行特色业务处理平台、分行渠道接入平台、分行对外连接平台等等。我们所服务的客户都是以数据为基础的,他们所提供给最终客户的任何一种服务都需要严格的记录、结算、报表等等,因此,我们的任何软件都离不开数据库,都是搭建在数据库基础之上的业务软件系统。数据库系统对于任何一个有一定软件基础的人来说,都
4、应该不是一个陌生的概念,但是,在实际运用过程中它确又往往给我们造成相当的麻烦,比如:数据准确性、数据完整性、数据库效率等等。所以,我们开设这门数据库培训课程,目的是让大家在知道、了解数据库基础知识的前提下,能够更深入的在数据库使用上有所收获。Tienon 所服务的客户中,绝大部分客户使用了 INFORMIX 数据库,因此,我们将以 INFORMIX为实例来为大家讲解数据库的相关知识。1.1、 读者对象学习过数据库原理的软件开发人员。1.2、 内容简介本期课程涉及两部分内容:INFORMIX 嵌入式 SQL 语法、INFORMIX 嵌入式 SQL 编译。INFORMIX 嵌入式 SQL 语法:了
5、解针对 INFORMIX 数据库的 C/C+嵌入 SQL 的语法。INFORMIX 嵌入式 SQL 编译:了解 C/C+嵌入 SQL 后的编译。1.3、 课程时间本期课程为期一天,讲解半天、演练半天。1.4、 课程目标本期课程属于 Tienon 数据库培训的第三课,目的是希望参训人员通过本期培训能够更进一步了解 INFORMIX 数据库编程。2、 INFORMIX 嵌入式 SQL 语法Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-52.1、 概念SQL 语言是非过程化语言,大部分语句的执行与其前面或后面的语句无关,而一些高级编程语言都是基于如循环、条
6、件等结构的过程化语言,尽管 SQL 语言非常有力,但它却没有过程化能力。若把 SQL 语言嵌入到过程化的编程语言中,则利用这些结构,程序开发人员就能设计出更加灵活的应用系统,具有 SQL 语言和高级编程语言的良好特征,它将比单独使用 SQL 或 C 语言具有更强的功能和灵活性。嵌入 SQL 程序主要由一种普通的编程语言代码组成,在我们这个场合中是 C, 并且在其中与一些特殊标记的段混合。要编译这样的程序,源代码首先经过嵌入的 SQL 预处理器处理,它把源代码转换成普通的 C 程序,然后这个程序可以用 C 编译工具进行处理。嵌入的 SQL 相比于其它的从 C 代码中处理 SQL 命令的优点有几条
7、:首先,它替你完成了那些从你的 C 程序的变量中传来传去数值问题;第二,在 C 代码里嵌入 SQL 是定义在 SQL 标准里的,并且被许多其它的 SQL 数据库支持。如上所述,为嵌入 SQL 接口写的程序通常是带着插入进来的特殊代码的 C 程序,这些特殊代码用于执行与数据库相关的动作。这些特殊代码通常的形式是下面这样:EXEC SQL .;这些语句语法上占据 C 语句的位置。根据具体语句的不同,它们可以出现在全局环境中或者在一个函数里。嵌入的 SQL 语句遵循普通 SQL 代码的大小写敏感规则,而不是遵循 C 代码的。2.2、 ESQL 程序的组成嵌入的 SQL 语句是指在应用程序中使用的 S
8、QL 语句。该应用程序称作宿主程序,书写该程序的语言称作宿主语言。嵌入的 SQL 语句与交互式 SQL 语句在语法上没有太大的差别,只是嵌入式 SQL语句在个别语句上有所扩充。如嵌入式 SQL 中的 SELECT 语句增加了 INTO 子句,以便与宿主语言变量打交道。此外,嵌入式 SQL 为适合程序设计语言的要求,还增加了许多语句,如游标的定义、打开和关闭语句等等。ESQL 程序包括两部分:程序首部和程序体。程序首部定义变量,为 ESQL 程序做准备,程序体包括各种 SQL 语句来操作数据库中的数据。在 ESQL 程序中嵌入的 SQL 语句以 EXEC SQL 作为起始标识,语句的结束以“;“
9、作为标识。在嵌入的 SQL 语句可以使用主语言 (这时是 C 语言)的程序变量(即主变量 ),这时主变量名前加冒号(:)作为标志,以区别于字段名。2.2.1、 程序首部每一个 ESQL 程序的开始,就是程序的首部,它包括以下两部分:Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-6 INCLUDE 语句:说明使用 ESQL 需要包含的头文件,它提供了错误处理,其功能等价于代替 C 语言中的#INCLUDE 语句。每个 ESQL 应用程序必须提供对错误的处理,为了说明 SQL 通讯域(SQLCA),必须在每个预编译程序中写上:EXEC SQL INCLU
10、DE SQLCA;SQLCA 是一结构,每一嵌入的执行性 SQL 语言的执行情况在其执行完成后写入 SQLCA 结构中的各变量中,根据 SQLCA 中的内容可以获得每一嵌入 SQL 语句执行后的信息,编制程序时就可以做适当的处理。 DECLARE 部分:说明特殊的主变量,这些变量区别于纯 C 语言程序中的变量,ESQL 使用这些变量与程序之间相互作用。在 DECLARE SECTION (描述部分) ,定义所有在 SQL 语句中用到的主变量,定义部分是EXEC SQL BEGIN DECLARE SECTION;(开始) 和 EXEC SQL END DECLARE SECTION;(结束)在
11、这两个语句中,只可以定义 SQL 语句中用到的主变量,每个预编译单元只允许一个BEGIN/END DECLARE SECTION (描述部分),但是一个程序可以包含许多独立的预编译单元。若一个主变量或指示变量在 ESQL 程序中的 SQL 语句中引用,但它没有在描述部分中定义,则程序在预编译时就会出现错误信息。在这两个语句中可以定义的变量有六种类型:INT、SHORT 、 CHAR、FLOAT 、NUMBER、DATE。其中 CHAR 型允许定义二维数组,其它类型只允许定义一维数组,不允许有指针类型,在此处变量可以赋值。例如:EXEC SQL BEGIN DECLARE SECTION; in
12、t sno; char sname11; short snameid; EXEC SQL END DECLARE SECTION; 主变量:就是用在 SQL 语句中的主语言变量。主要用于程序变量和数据库内部交换数据之用,它们的数据类型必须是在主语言中描述部分里定义过的,而且它们的数据类型必须和数据库中已定义的表中的数据类型相匹配。例如:SELECT 姓名, 等级 FROM 供应商 INTO :sname, :status WHERE 供应商号=:sno;该语句表示,从供应商表中在供应商号与主变量 sno 一致的地方选择供应商姓名和供应商等级,Tienon 数据库培训教程INFORMIX 嵌入式
13、 SQL 编程天用唯勤,服务至上 3-7把结果传送到主变量 sname, status 中。主变量使用规则:1. 必须在描述部分明确定义。2. 必须使用与其定义相同的大小写格式。3. 在 SQL 语句中使用主变量时必须在主变量前写一个冒号“:“ ,在纯 C 语言语句中则不要在主变量前写冒号。4. 不能是 SQL 命令的保留字。5. 在一条语句中只能使用一次。2.2.2、 程序体程序体可以包含许多 SQL 语句,以查询或处理存储在数据库中的数据。在应用程序中所包含的 SQL 语句,可以查询或操纵存储在中的数据,这些语句叫做数据操纵语言(DML),应用程序体也可以包含 DDL 语句,用来建立或定义
14、数据结构,如表、视图或索引。在用户程序中写入的任何有效的 SQL 语句都可以被执行,只需要把完整的 SQL 语句按嵌入式的要求写入C 语言的合适位置即可。嵌入在 C 语言中的 SQL 语句以 EXEC SQL 开始,以“;“ 为结束标志。SQL 语句中可以嵌入主变量,主变量前应有“:“标志。如下面例子都是嵌入式 SQL 语句:EXEC SQL UPDATE 供应商 SET 姓名=李 红 WHERE 供应商号=S1; /* 把供应商号是 S1 的供应商姓名改为 李 红*/EXEC SQL INSERT INTO 供应商( 供应商号,姓名,等级, 城市) VALUES(:sno,:sname,:s
15、tatus,:city);/* 根据宿主变量值插入供应商表中 */EXEC SQL DELETE FROM 供应商 WHERE 等级 IS NULL; /* 删除供应商等级是空值的供应商 */ 从上面例可以看出,静态的增、删、改语句与交互方式没有太大的差别,但对于查询语句就没有那么简单,查询语句在后面介绍。2.3、 ESQL 语法总的来说,ESQL 的语法与 SQL 语法类似,只是需要套用 ESQL 的编写规范,前缀”EXEC SQL”,以”;”为结束符,引用变量时在变量前加”:”等等,当然也有很多与 SQL 语法有一定区别的,比如查询、游标等。2.3.1、 连接数据库任何一个 EC 程序要操
16、作数据库,都必须首先连接数据库,这与 ODBC、ADO 等操作数据库是一Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-8致的。我们用下面的语句与一个数据库连接:EXEC SQL DATABASE 目标;目标可以用下面的方法声明:数据库名主机名:端口 这里是一些连接语句的例子: 方法一:EXEC SQL DATABASE mydb;方法二:EXEC SQL BEGIN DECLARE SECTION;char target10 = “mydb“;EXEC SQL END DECLARE SECTION;.EXEC SQL DATABASE :targe
17、t;最后的一个形式使用了上面说过的变量引用的方法。在后面的小节里你会看到在 SQL 语句里如何使用前缀了冒号的 C 变量。2.3.2、 关闭连接任何一个 EC 应用程序在运行结束前都必须将已经连接的数据库关闭。EXEC SQL DISCONNECT CURRENT;断开与当前连接的数据库。2.3.3、 运行 SQL 命令在嵌入的 SQL 应用中可以运行任何 SQL 命令。下面是一些如何使用它们的例子。 创建一个表: EXEC SQL CREATE TABLE foo (number integer, ascii char(16);EXEC SQL CREATE UNIQUE INDEX num
18、1 ON foo(number);插入一些行: EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, doodad);删除一些行: EXEC SQL DELETE FROM foo WHERE number = 9999;Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-9单行 select: EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = doodad;使用游标的 select: EXEC SQL DECLARE foo_bar
19、 CURSOR FORSELECT number, ascii FROM fooORDER BY ascii;EXEC SQL OPEN foo_bar;EXEC SQL FETCH foo_bar INTO :FooBar, :DooDad;.EXEC SQL CLOSE foo_bar;EXEC SQL FREE foo_bar;更新: EXEC SQL UPDATE foo SET ascii = foobar WHERE number = 9999;形如 :something 这样的记号是宿主变量,也就是说,它们指向 C 程序里的变量。2.3.4、 使用宿主变量前面的语句有些只使用了固
20、定的数值,并没有提供一个插入用户提供的数值到语句中的方法,也没有提供让程序访问查询返回的数值的方法。这种类型的语句在真正的应用中并不是很有用。本节详细解释如何在你的 C 程序和嵌入的 SQL 语句之间使用一种被称作宿主变量的机制传递数据。 在 C 程序和 SQL 语句之间传递数据在嵌入的 SQL 里特别简单。我们不用把数据贴到语句中,这样必然会有各种复杂事情需要处理,比如正确给数值加引号等等,我们只需要在 SQL 语句里写上 C 变量的名字,前缀一个冒号即可。 比如:EXEC SQL INSERT INTO sometable VALUES (:v1, foo, :v2);这个语句引用了两个
21、C 变量,一个叫 v1,另一个叫 v2,并且也使用一个普通的 SQL 字串文本,这样表明你并不局限于只使用某一种数据。 这种在 SQL 语句里插入 C 变量的方式在 SQL 语句里任何需要表达式的地方都可以用。在 SQL 语句里,我们把引用的 C 变量叫做宿主变量。 要从程序中向数据库传递数据,比如,查询中的参数,或者从数据库里向程序传回的数据,想包含这类数据的 C 变量必须在一个特殊的标记段里面声明,这样嵌入的 SQL 预处理器就会明白要做什么。 这个段以下面的代码开头 EXEC SQL BEGIN DECLARE SECTION;以下面的代码结束 EXEC SQL END DECLARE
22、SECTION;Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-10在这两行之间,是普通的 C 变量声明,比如 int x;char foo16, bar16;在程序里你可以有任意多个声明段。 这些声明也同时以普通 C 变量的形式回显到输出文件中, 因此,我们不必再次声明他们。那些不准备在 SQL 命令里使用的变量可以像通常一样在这些特殊的段外面声明。 结构或者联合的定义也必须在 DECLARE 段中列出。 否则,预处理器就无法处理这些类型,因为它不知道定义。 现在你应该能把你的程序生成的数据传递到 SQL 命令里面去了。但是你如何检索一个查询的结果呢
23、?为了这个目的,嵌入的 SQL 提供了常用命令 SELECT 和 FETCH 的特殊变体。 这些命令有了特殊的 INTO 子句,声明检索出来的数值存储在哪个宿主变量里。 下面是一些例子: /* 假设表是这个:* CREATE TABLE test1 (a int, b varchar(50);*/EXEC SQL BEGIN DECLARE SECTION;int v1;CHAR v251;EXEC SQL END DECLARE SECTION;.EXEC SQL SELECT a, b INTO :v1, :v2 FROM test;所以,INTO 子句出现在选择列表和 FROM 子句之间
24、。选择列表和 INTO 后面的列表的元素(也叫目标列表)个数必须相同。 下面是使用 FETCH 命令的例子:EXEC SQL BEGIN DECLARE SECTION;int v1;CHAR v251;EXEC SQL END DECLARE SECTION;.EXEC SQL DECLARE foo CURSOR FOR SELECT a, b FROM test;Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-11.do .EXEC SQL FETCH foo INTO :v1, :v2;. while (.);EXEC SQL CLOSE fo
25、o;EXEC SQL FREE foo;这里的 INTO 子句出现在所有正常的子句后面。 这些方法只能一次检索一行。如果你需要处理可能多于一行的结果集, 那么你需要使用游标。 2.3.5、 游标的使用我们知道 SQL 语言是一种面向集合的语言,而普通的高级语言则是面向记录的语言,要想使SQL 语言能与宿主语言通讯, ESQL 提供了游标操作,能把 SQL 的集合操作结果,按单个记录方式取出,赋于主变量进行进一步的处理。如果查询结果返回多行或不知返回多少行,就可使用带游标的 SELECT 语句。一个游标(CURSOR)是ESQL 使用的工作区域,使用这个工作区存放着一个查询结果。一个已命名的游标
26、是和一条 SELECT语句相关联。一个游标必须首先定义(同一个查询相关联),然后用三条可运行的 SQL 语句使用游标,以操纵数据。五条操纵游标的命令如下: DECLRE CURSOR OPEN CURSORFETCH CLOSE FREE DECLARE CURSOR 语句用来定义一游标,此时游标处于关闭状态。用 OPEN CURSOR 语句打开游标后,就可用它从相关的查询中取出多于一行的结果。所有满足查询条件的行组成一个集合,叫做游标活动集。通过 FETCH 取操作,活动集中的每一行可以一个一个的返回,当查询作完后,游标就可以用 CLOSE 语句关闭以及 FREE 语句释放空间。ESQL 中
27、的 DECLARE CURSOR 语句定义游标,赋给它一个与查询相关的游标名。该语句的格式为: EXEC SQL DECLARE CURSOR FOR FOR UPDATE; Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-12其中:(1) SELECT 语句应不含 INTO 子句。(2) 若无 FOR UPDATE 则无法执行 UPDATE(定位)和 DELETE(定位) 语句。定义游标的 DECLARE 语句必须出现在程序中对游标进行操作的所有语句之前, ESQL 不能引用没有说明的游标,游标的定义范围是整个程序。程序中可包含多个 DECLARE
28、语句,这些语句定义了不同的游标,并把游标与不同的查询联系在一起,所以在同一个程序中的两个 DECLARE 语句中不能说明同一个游标名。ESQL 中 OPEN CURSOR 语句格式如下:EXEC SQL OPEN ;OPEN 语句决定了满足查询的行的集合,游标处于打开状态,它的活动集就是满足 WHERE 子句条件的行的集合。这时,游标处在活动集的第一行的前面。ESQL 中的 FETCH CURSOR 语句读出活动集中的行,并把结果送到输出主变量,输出主变量是在相关的 FETCH 语句中定义的。其格式如下: EXEC SQL FETCH INTO ; 游标必须先定义,然后再打开,只有当游标处于打
29、开状态时,才执行 FETCH 语句。在第一次运行 FETCH 时,游标从活动集的第一行前移到当前第一行,使这一行成为当前行。每次运行 FETCH时游标在活动集中向前移,把选出的结果送到主变量表中指定的输出主变量中。如果游标活动集中是空的,或所有的行已经被取走,就返回一代码。(sqlca.sqlcode=100)。游标只可在活动集中向前移动,无法取到已经用 FETCH 取过的行,要想再取这一行,就必须关闭游标,再重新打开它。当取完活动集中所有行后,必须关闭游标,以释放与该游标的关的资源。其格式如下:EXEC SQL CLOSE ; EXEC SQL FREE ;2.3.6、 动态 SQL某在许多
30、情况下,应用要执行的具体的 SQL 语句在书写应用的时候就已经知道了。不过,在些情况下,SQL 语句是在运行时或者由外部的数据提供的。在这种 情况下,我们不能直接在 C 代码嵌入 SQL 语句,但是有个机制可以允许你调用放在一个字串变量里的任何 SQL 语句。 执行任意 SQL 语句最简单的方法是使用 EXECUTE 命令。比如: EXEC SQL BEGIN DECLARE SECTION;char stmt256 = “CREATE TABLE test1 (.);“;EXEC SQL END DECLARE SECTION;EXEC SQL EXECUTE :stmt;Tienon 数据
31、库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-13你不能用这个办法执行检索数据的语句(也就是说,SELECT) 。 执行任意 SQL 语句的更强大的方法是准备这些语句一次,并且执行这些准备好的语句任意多次。我们也可以准备一个普遍的语句版本,然后通过替换一些参数,执行一个特定的版本。在准备语句的时候,在你稍后需要替换参数的地方书写一个问号。比如: EXEC SQL BEGIN DECLARE SECTION;char stmt256 = “INSERT INTO test1 VALUES(?, ?);“;EXEC SQL END DECLARE SECTION;EXEC
32、 SQL PREPARE mystmt FROM :stmt;.EXEC SQL EXECUTE mystmt USING 42, foobar;EXEC SQL FREE mystmt;如果你在执行的语句返回数值,那么增加一个 INTO 子句: EXEC SQL BEGIN DECLARE SECTION;const char stmt256 = “SELECT a, b, c FROM test1 WHERE a ?“;int v1, v2;CHAR v351;EXEC SQL END DECLARE SECTION;EXEC SQL PREPARE mystmt FROM :stmt;.
33、EXEC SQL EXECUTE mystmt INTO :v1, :v2, :v3 USING 37;EXEC SQL FREE mystmt;一个 EXECUTE 命令可以有一个 INTO 子句, 一个 USING 子句,也可以两个都有或者两个都没有。 如果你不再需要已准备好的语句,你应该释放它: EXEC SQL FREE name;2.3.7、 错误处理INFORMIX 的错误信息是保存在 SQLCA 结构中的,只要在应用程序前添加了 EXEC SQL INCLUDE SQLCA;就能在后续直接使用 sqlca 这个结构。sqlca.sqlcode 表示执行 SQL 语句所返回的错误码
34、。sqlca.sqlerrm 表示执行 SQL 语句所返回的错误描述。因此,我们在写 EC 程序时,往往都需要在 SQL 语句后,对 sqlca.sqlcode 进行判断,对于Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-14INFOMRIX 数据库 0 表示成功,100 表示 NOT FOUND,其余表示执行失败。为了查询 sqlca.sqlcode 错误码所对应的详细错误描述,可以使用 finderr 命令来查询数据库的错误帮助,finderr 错误码( 一般错误码为负值,查询时可以直接用正值)。例如:EXEC SQL INSERT INTO f
35、oo VALUES(:f1, :f2);if(0 != sqlca.sqlcode)printf(“插入 foo 数据表错,错误信息%s”, sqlca.sqlerrm);2.3.8、 事务处理需要使用事务处理时,可以这样使用:EXEC SQL BEGIN WORK;EXEC SQL COMMIT WORK;EXEC SQL ROLLBACK WORK;2.3.9、 程序实例例题程序 1 (建立一表并向表中插入数据) /*= This is a sample program which include SQL sentence about CREATE ,INSERT a table.=*/E
36、XEC SQL BEGIN DECLARE SECTION ; char sno10,sname10,city10; int status; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE SQLCA; main() int i; EXEC SQL DATABASE “mydb“ ; /* Create a table named S_TEST */EXEC SQL CREATE TABLE S_TEST(Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-15SNO CHAR (9), SNAME CHAR
37、 (20), STATUS INT ,CITY CHAR(10); if(0 != sqlca.sqlcode)printf(“数据库连接错%s”, sqlca.sqlerrm);exit(-1);printf(“ create table success,insert?“);printf(“ 0 - no “);printf(“ 1 - yes “);printf(“ choice:“);scanf(“%d“,while(i) printf(“input sno:“);scanf(“%s“,sno);printf(“input sname:“); scanf(“%s“,sname); pri
38、ntf(“input status:“); scanf(“%d“, printf(“input city:“); scanf(“%s“,city); EXEC SQL INSERT INTO S_TEST(SNO,SNAME,STATUS,CITY)VALUES (:sno,:sname,:status,:city);if(0 != sqlca.sqlcode)printf(“数据库插入错%s”, sqlca.sqlerrm);exit(-1);printf(“continue?“); printf(“ 0 -terminate “);printf(“ 1 -continue “);print
39、f(“ choice:“);scanf(“%d“,/*log off database*/ EXEC SQL DISCONNECT CURRENT;Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-16exit(0);Tienon 数据库培训教程INFORMIX 嵌入式 SQL 编程天用唯勤,服务至上 3-173、 INFORMIX 嵌入式 SQL 编译嵌入 SQL 的编译一般都是先有 SQL 预编译器进行预编译生成 C/C+程序,然后用 C/C+编译器编译成应用程序。对于 C/C+编译,在前面的培训中已经讲解了,包括编译器的用法以及 makefile
40、文件的书写,这里我们介绍 INFORMIX 的预编译器,以及如何插入到 makfile 中。3.1.1、 预编译器INFORMIX 编译器为 $(INFORMIXDIR)/bin/esql 这个脚本,脚本中有详尽的参数说明。使用 esql可以只对 ec 程序进行预编译,也可以直接编译为应用程序。3.1.2、 makefile 编写方法对于 c 程序,我们使用 cc 进行编译, ec 程序我们可以直接用 esql 编译成应用程序,写法如下:esql c mytest.ec对于 C+程序,我们使用 CC 进行编译,ecpp 程序我们可以先用 esql 进行预编译,然后用 CC进行编译,写法如下:esql e mytest.ecppCC c mytest.C4、 练习编写 EC 程序,在程序中连接数据库、创建数据表、插入数据、修改数据、删除数据、查询单条数据、使用游标查询多条数据、关闭数据库,将每一步结果打印在屏幕上,使用 esql 编译运行该程序。