esql/c (2)

zjpwm 2003-08-20 01:05:57
第二章 ESQL 程序的基本结构

ESQL程序由两部分组成:程序首部和程序体.

2.1 程序首部
每一个ESQL程序的开始,就是程序的首部,它包括以下三部分:
1.DECLARE部分:
说明特殊的主变量,这些变量区别于纯C语言程序中的变量,COBASE使用这些变量与程序之间相互作用.
2.INCLUDE USERCA语句: 说明一个SQL语句的通讯域(USERCA),它提供了错误处理,其功能等价于代替C语言中的#INCLUDE语句.
3.CONNECT语句: 建立程序与COBASE之间的连接.

2.1.1DECLARE部分:(描述部分)
在DECLARE SECTION (描述部分),定义所有在SQL语句中用到的主变量,定义部分是以:
EXEC SQL BEGIN DECLARE SECTION;
和 EXEC SQL END DECLARE SECTION;
开始和结束的.
在这两个语句中,只可以定义 SQL 语句中用到的主变量,每个预编译单元只允许一个BEGIN/END DECLARE SECTION (描述部分),但是一个程序可以包含许多独立的预编译单元。若一个主变量或指示变量在ESQL程序中的SQL语句中引用,但它没有在 描述部分中定义,则程序在预编译时就会出现错误信息.
在这两个语 句中可以定义的变量有六种类型:INT,SHORT,CHAR,FLOAT,NUMBER,DATE.其中CHAR型允许定义二维数组,其它类型只允许定义一维数组,不允许有指针类型 ,在此处变量可以赋值.
例如:
EXEC SQL BEGIN DECLARE SECTION;
int sno;
char sname[11];
short snameid;
EXEC SQL END DECLARE SECTION;
(1)主变量:
就是用在SQL语句中的主语言变量.主要用于程序变量和数据库内部交换数据之用,它们的数据类型必须是在主语言中描述部分里定义过的,而且它们的数据类型必须和COBASE数据库中已定义的表中的数据类型相匹配.
例如:
SELECT 姓名, 等级
FROM 供应商
INTO :sname, :status
WHERE 供应商号=:sno;
该语句表示,从供应商表中在供应商号与主变量sno一致的地方选择供应商姓名和供应商等级,COBASE把结果传送到主变量sname,status中.
主变量使用规则:
1.必须在描述部分明确定义.
2.必须使用与其定义相同的大小写格式.
3.在SQL语句中使用主变量时必须在主变量前写一个冒号":",在纯C语言 语句中则不要在主变量前写冒号.
4.不能是SQL命令的保 留字.
5.在一条语句中只能使用一次.

2.1.2 SQL通讯域
每个COBASE应用程序必须提供对错误 的处理,为了说明SQL通讯域(USERCA),必须在每个COBASE预编译程序中写上:
EXEC SQL INCLUDE USERCA;
USERCA是一结构,每一嵌入的执行性SQL语言的执行情况在其执行完成后写入USERCA结构中的各变量中, 根据USERCA中的内容可以获得每一嵌入SQL语句执行后的信息,编制程序时就可以做适当的处理.对其的详细说明见第五章.

2.1.3 连接COBASE
在 存取COBASE数据之前,每一个预编译程序必须与COBASE连接.连接时,程序必须提供用户名和口令,由COBASE进行校验,若口令和用户名正确,方可登录COBASE,获得使用权,否则,COBASE拒绝登录,则程序就不能使用数据库.缺省的用户名为“cobase”,口令为“cobase”。
连接COBASE的格式如下:
EXEC SQL CONNECT <用户名>:<用户口令>.
CONNECT语句必须是ESQL程序中第一条可执行的SQL语句.
2.2 程序体
程序体可以包含许多SQL语句,以查询或处理存储在COBASE数据库中的数据.
在应用程序中所包含的SQL语句,可以查询或操纵存储在COBASE中的数据,这些语句叫
做数据操纵语言(DML),应用程序体也可以包含DDL语句,用来建立或定义数据结构,如表、视图或索引.在用户程序中写入的任何有效的SQL语句都可以被执行,只需要把完整的SQL语句按嵌入式的要求写入C语言的合适位置即可.嵌入在C语言中的SQL语句以EXEC SQL 开始,以";"为结束标志.SQL语句中可以嵌入主变量,主变量前应有":"标志.如下面例子都 是嵌入式SQL语句:
EXEC SQL UPDATE 供应商
SET 姓名='李 红'
WHERE 供应商号='S1';
/* 把供应商号是S1的供应商姓名改为 '李 红'*/
EXEC SQL INSERT INTO 供应商(供应商号,姓名,等级,城市)
VALUES((:sno,:sname,:status,:city));
/* 根据宿主变量值插入供应商表中 */

EXEC SQL DELETE FROM 供应商
WHERE 等级 IS NULL;
/*删除供应商等级是空值的供应商*/
从上面例可以看出,静态的增,删,改语句与交互方式没有太大的差别,对于查询语句就没有那么简单,查询语句在下一章中介绍.
现用几个例题程序加以说明.
例题程序1 (建立一表并向表中插入数据)

/*==============================================================================
This is a sample program which include SQL sentence about
CREATE ,INSERT a table.
==============================================================================*/
EXEC SQL BEGIN DECLARE SECTION ;
CHAR sno[10],sname[10],city[10];
INT status;
EXEC SQL END DECLARE SECTION ;
EXEC SQL INCLUDE USERCA;
main()
{
int i;
EXEC SQL CONNECT "cobase:cobase" ;
EXEC SQL CREATE TABLE S_TEST /* Create a table named S_TEST */
(SNO CHAR (9),
SNAME CHAR (20),
STATUS INT ,CITY CHAR(10));
printf(" create table success,insert?");
printf(" 0 ---- no ");
printf(" 1 ---- yes ");
printf(" choice:");
scanf("%d",&i);
while(i)
{
printf("input sno:");
scanf("%s",sno);
printf("input sname:");
scanf("%s",sname);
printf("input status:");
scanf("%d",&status);
printf("input city:");
scanf("%s",city);
EXEC SQL INSERT INTO S_TEST(SNO,SNAME,STATUS,CITY)
VALUES ((:sno,:sname,:status,:city));
printf("continue?");
printf(" 0 ----terminate ");
printf(" 1 ----continue ");
printf(" choice:");
scanf("%d",&i);
}
EXEC SQL COMMIT;
EXEC SQL DISCONNECT; /*log off database*/
exit(0);
}

...全文
84 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,194

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 Informix
社区管理员
  • Informix社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧