INFORMIX-ESQL/C编程

本文介绍INFORMIX-ESQL/C的基本概念,包括SQL语句的嵌入方法、宿主变量的使用、头文件的作用及错误诊断。同时,提供了一个简单的ESQL/C程序示例,并解释了如何进行ESQL/C程序的编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  关于 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.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 库以及用户自己所链接的库生成可执行文件。  
   
    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;  
  …  
  }  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值