1.1 SQL语句嵌入方法
任何可以交互式输入的SQL语句,例如数据定义语句、数据检索语句、数据控制语句等,都可以嵌入到C程序中。
可以使用两种方法指明SQL语句:
一种是在SQL语句之前用“$”作为前缀,如: #include
$ database book;
$ delete from book where book_num=100; ? }
另一种是在SQL语句之前使用ANSI标准的EXEC SQL关键字来标识,如: #include
EXEC SQL database book;
EXEC SQL delete from book where book_num=100; ? }
1.2 宿主变量
SQL语句中可以有变量,变量可以出现在交互式SQL语句中常量可以出现的任何位置,SQL语句中的这种变量称为宿主变量。INFORMIX-ESQL/C程序通过宿主变量在C语句和SQL语句中传递数据。一般情况下,在宿主变量前加“$”符来标识。如:
$ update book set book_price = $fNewPrice;
在定义宿主变量时也需要在定义语句前用“$”符来标识,如: $ int iNumber; $ char name[10]; $ struct student { int no; char name[10]; } stu;
另外,宿主变量可以像C语言变量一样用在C语言表达式中,如: $ char dbname[11]; gets( dbname, 80 ); $ database $dbname;
1.3 头文件
INFORMIX-ESQL/C提供了许多头文件,其中最常用的是sqlca.h,它用于确定SQL语句的返回值和SQL语句执行后的其他信息,在ESQL/C程序中是必须包含的,包含方法是“$include sqlca”。另外,如果自定义的头文件中包含SQL语句或宿主变量的定义,也必须用同样的方法进行说明,如:$include filename。如果源文件在某个路径下,应将其用引号括起来,如:
#include
$include \ 1.4 错误诊断
在INFORMIX-ESQL/C程序中执行一条SQL语句时,数据库服务器会返回几种信息,反映SQL语句的执行情况,包括:
__该SQL语句的完成状况; __有关性能的信息;
__有关可能发生或已经发生的事情的警告。
这些返回信息传送到一个称为sqlca的结构中,该结构定义在sqlca.h中: struct sqlca_s{ long sqlcode; char sqlerrm[72]; char sqlerrp[8]; long sqlerrd[6]; struct sqlcaw_s{ char sqlwarn0; char sqlwarn1; char sqlwarn2; char sqlwarn3; char sqlwarn4; char sqlwarn5; char sqlwarn6; char sqlwarn7; } sqlwarn; } sqlca;
上述sqlca结构中的信息反映了INFORMIX-ESQL/C语句执行后的情况:成功或异常,其中异常情况包括三种:
(1) 执行成功,但没有找到记录; (2) 执行成功,但出现警告信息; (3) 执行结果失败。
可通过sqlcode来检测SQL语句的执行结果,其含义如下: __sqlcode=0时,说明语句执行成功;
__sqlcode=100,说明在执行Select或Fetch查找操作后返回零记录,在sqlca.h中将宏SQLNOTFOUND定义为100;
__sqlcode<0时,说明SQL语句执行后有错误发生
以下是一个简单的ESQL/C程序: #include
main() {
$char fname[15]; $char lname[20]; int i;
printf( \
$database book;
$declare democursor cursor for
select fname,lname into $fname, $lname from bookname where lname>\$open democursor; for( ; ; ) { $fetch democursor; if ( sqlca.sqlcode==100 ) break;
printf( \}
$close demecursor;
printf( \}
1.5 ESQL/C程序的编译
用INFORMIX-ESQL/C语句编写的程序在使用C编译程序之前必须预处理,预处理程序把嵌入的语句转换成C语言程序。
INFORMIX-ESQL/C提供了编译命令esql,用来编译INFORMIX-ESQL/C源代码,这些源代码的名称必须具有.ec后缀才能进行转换。转换后的结果存在与源文件同名但后缀为“.c”的文件中,然后调用C编译器将.c文件转换成以.o为后缀的目标文件,最后调用C语言标准库和INFORMIX-ESQL/C库以及用户自己所链接的库生成可执行文件。
二 C语言程序中嵌入的SQL语句 2.1 有关数据库和表的权限 2.1.1 选择数据库(DATABASE)
功能:DATABASE语句用来选择已存在的数据库,使其成为当前数据库。 格式:DATABASE database_name
2.2 关闭数据库(CLOSE DATABASE) 功能:关闭当前数据库。 格式:CLOSE DATABASE
2.2.1 创建表(CREATE TABLE)
功能:在当前数据库中建立一张新表。 格式:CREATE [TEMP] TABLE table_name (column_name datatype [NOT NULL],?)
2.2.2 删除表(DROP TABLE)
功能:删除一个已存在的表,以及相关的索引和数据。 格式:DROP TABLE table_name
2.3 数据查询语句SELECT
数据查询语句SELECT的执行结果有三种情况: l 没有满足条件的记录; l 返回单个记录; l 返回多个记录。
前两种情况可以使用单个的SELECT语句,最后一种情况必须使用游标进行查询。
格式: SELECT 子句 [INTO子句] FROM TableList [WHERE FilterJoin] [GROUP BY ColumnGroupList] [HAVING GroupFilter] [ORDER BY OrderFilter] [INTO TERMTable]
说明: INTO子句检索出来的数据存放的宿主变量 INTO TEMPTable 将检索处理的结果存在至临时表
SELECT如果返回多个记录,必须通过游标方式进行处理。如果返回单条记录,我们将该语句称为单记录SELECT语句,如果有记录返回,sqlca.sqlcode则被设置为0,如果没有满足条件的记录,sqlca.sqlcode则被设置为SQLNOTFOUND,以下是对单记录SELECT语句操作的示例: $char fj[11],zh[10],xb[20]; $double zhxb;
$SELECT fj,zh,xb,zhxb into $fj, $zh, $xb, $zhxb from book
where book_num=100;
if ( sqlca.slqcode == SQLNOTFOUND ) printf( \没有满足条件的记录\\n\if ( sqlca.sqlcode == 0 ) { printf( \书名:%s\\n\printf( \作者:%s\\n\printf( \出版社:%s\\n\printf( \定价:%.2f\\n\}
2.4 插入语句INSERT
功能:INSERT语句的主要目的是在表中增加一条或多条新记录。 格式: INSERT INTO table_name [(ColumnList)] VALUES( valuelist ) 示例:
$INSERT INTO Customer( customer_num, fname, lname, company ) VALUES( 0, $Firstname, $Lastname, \
2.5 数据修改语句UPDATE
功能:UPDATE语句用来改变一个或多个记录中的一个或多个字段的值。 格式: UPDATE table_name SET
{column_name=expr[,?]|(column_list)=(expr_list)} [WHERE condition] 示例:
$UPDATE customer SET
(fname,lname)=($Fname,$Lname) WHERE customer_num=$cust;
2.6 数据删除语句DELETE
功能:删除语句DELETE从数据库表中删除一个或多个记录。 格式: DELETE FROM table_name [WHERE {condition}] 示例:
$DELETE FROM book WHERE book_num=$booknum;
2.7 PREPARE语句
功能:PREPARE语句显示地请求对SQL语句进行语法分析。 格式: PREPARE statement_name FROM string_spec 示例:
$PREPARE Del FROM
\
if ( SQLCODE < 0 ) { // SQLCODE=sqlca.sqlcode printf( \exit( -1 ); }
while( ? ) { ?
$EXECUTE Del Using $book10; ? }

