关于
INFORMIX-ESQL/C
编程,有很多东西可以学习。我贴一点基本资料在这里吧
——
1.1 SQL 语句嵌入方法
任何可以交互式输入的 SQL 语句,例如数据定义语句、数据检索语句、数据控制语句等,都可以嵌入到 C 程序中。
可以使用两种方法指明 SQL 语句:
一种是在 SQL 语句之前用 “$” 作为前缀,如:
#include <stdio.h>
main()
{
$ database book;
$ delete from book where book_num=100;
…
}
另一种是在 SQL 语句之前使用 ANSI 标准的 EXEC SQL 关键字来标识,如:
#include <stdio.h>
main()
{
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 <stdio.h>
$include sqlca;
$include xyz.h;
$include "/users/test/test.h";
1.1 SQL 语句嵌入方法
任何可以交互式输入的 SQL 语句,例如数据定义语句、数据检索语句、数据控制语句等,都可以嵌入到 C 程序中。
可以使用两种方法指明 SQL 语句:
一种是在 SQL 语句之前用 “$” 作为前缀,如:
#include <stdio.h>
main()
{
$ database book;
$ delete from book where book_num=100;
…
}
另一种是在 SQL 语句之前使用 ANSI 标准的 EXEC SQL 关键字来标识,如:
#include <stdio.h>
main()
{
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 <stdio.h>
$include sqlca;
$include xyz.h;
$include "/users/test/test.h";
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 <stdio.h>
$include sqlca;
main()
{
$char fname[15];
$char lname[20];
int i;
printf( "This is a ESQL/C Program!/n" );
$database book;
$declare democursor cursor for
select fname,lname into $fname, $lname
from bookname
where lname>"C";
$open democursor;
for( ; ; ) {
$fetch democursor;
if ( sqlca.sqlcode==100 )
break;
printf( "%s%s/n", fname, lname );
}
$close demecursor;
printf( "/nProgram Over./n" );
}
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 库以及用户自己所链接的库生成可执行文件。
在 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 <stdio.h>
$include sqlca;
main()
{
$char fname[15];
$char lname[20];
int i;
printf( "This is a ESQL/C Program!/n" );
$database book;
$declare democursor cursor for
select fname,lname into $fname, $lname
from bookname
where lname>"C";
$open democursor;
for( ; ; ) {
$fetch democursor;
if ( sqlca.sqlcode==100 )
break;
printf( "%s%s/n", fname, lname );
}
$close demecursor;
printf( "/nProgram Over./n" );
}
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", fj );
printf( " 作者: %s/n", zh );
printf( " 出版社: %s/n", xb );
printf( " 定价: %.2f/n", zhxb );
}
2.4 插入语句 INSERT
功能: INSERT 语句的主要目的是在表中增加一条或多条新记录。
格式: INSERT INTO table_name
[(ColumnList)]
VALUES( valuelist )
示例:
$INSERT INTO Customer( customer_num, fname, lname, company )
VALUES( 0, $Firstname, $Lastname, "JOHN CORP" );
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
"delete from book where boo_num=?";
if ( SQLCODE < 0 ) { // SQLCODE=sqlca.sqlcode
printf( "prepare Del Error sqlcode=%d/n", SQLCODE );
exit( -1 );
}
while( … ) {
…
$EXECUTE Del Using $book10;
…
}
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", fj );
printf( " 作者: %s/n", zh );
printf( " 出版社: %s/n", xb );
printf( " 定价: %.2f/n", zhxb );
}
2.4 插入语句 INSERT
功能: INSERT 语句的主要目的是在表中增加一条或多条新记录。
格式: INSERT INTO table_name
[(ColumnList)]
VALUES( valuelist )
示例:
$INSERT INTO Customer( customer_num, fname, lname, company )
VALUES( 0, $Firstname, $Lastname, "JOHN CORP" );
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
"delete from book where boo_num=?";
if ( SQLCODE < 0 ) { // SQLCODE=sqlca.sqlcode
printf( "prepare Del Error sqlcode=%d/n", SQLCODE );
exit( -1 );
}
while( … ) {
…
$EXECUTE Del Using $book10;
…
}