一、包含嵌入式SQL 程序的处理过程
- 由预处理程序对源程序进行扫描,识别出ESQL语句
- 把它们转换成主语言的函数调用语句,使主语言编译程序能够识别
- 最后由主语言的编译程序将整个源程序编译成目标码
- 将编译后生成的目标代码与库函数(SQL函数库)链接在一起生成可执行代码
二、标识SQL语句
C语言中, 引导符为exec sql 终止符为 ;
exec sql <SQL语句>;
Java语言中, 引导符为 # sql 终止符为 ;
#sql{<SQL语句>;
三、程序与数据库的连接和断开
SQL标准推荐的连接方式
exec sql connection to target [AS connection-name] [user: user-name];
程序运行过程中可以修改当前连接
exec sql set connection connection-name;
所有操作完成后,关闭数据库连接: exec sql disconnection [connection];
例:
exec sql connect :user_name identified by :user_pwd; exec sql commit release;
exec sql connect to localhost.test user sa.12345; exec sql disconnect all;
四、嵌入式SQL与主语言之间的通信
- SQL通信区
SQLCA:
SQLCA(SQL Communication Area)是一个结构体变量,声明以后分配一个内存区,保存SQL语句执行的状态信息,用于DBMS与应用程序的通信
定义SQLCA:
exec sql include sqlca;
使用SQLCA
例如:sqlca.sqlcode
sqlca.sqlstate
sqlcode: 整型字段
= 0 表示该SQL语句执行成功, 没有发生错误和异常。
> 0 表示执行了该SQL语句, 但有异常。
< 0 表示由于DB、系统、网络或程序有错误, 语句未执行
例:if (sqlca.sqlcode != 0) /* 判断数据库操作是否成功*/
break;
- 主变量
主变量(Host Variable):在ESQL中使用的主语言程序变量,包括输入主变量与输出主变量
使用主变量的例子:
exec sql select Sname, Sage into :vSname, :vSage
from Student
where Sname= :specName;
使用into+主变量可以保存单条查询结果,使用主变量前要加冒号
主变量声明:
exec sql begin declare section;
char vSname[10], specName[10]=“张三”; int vSage;
exec sql end declare section;
指示变量(IndicatorVariable):主变量附带一个整型变量, 用于“指示”所指主变量的值或条件
例如:
exec sql select sno into :id indicator :indic
from student where sage > 25;
if (indic = = -1) //指示变量
{ printf(“The id is null”); }
else
{......}
例如:
if(...) gradeid=-1;
exec sql insert into SC(Sno, Cno, Grade) values (:stdno, :couno, :gr:gradeid);
注意:不能在搜索条件中使用<:主变量:指示变量>这种形式
- 游标
系统为结果记录集开设一个数据缓存区,游标是指向数据缓存区的指针,通过指针的移动,逐一从缓存区获取记录,赋给主变量
游标的定义:
exec sql declare <游标名> cursor for
<SQL语句>;
例如:
exec sql declare cur_student cursor for
select Sno, Sname, Sclass from Student where Sclass= :vClass order by Sno
打开游标
exec sql open <游标名>;
读取元组
exec sql fetch <游标名> into :主变量1, :主变量2......;
关闭游标
exec sql close <游标名>;
例如:
exec sql declare cur_student cursor for
select Sno, Sname, Sclass from Student where Sclass=‘035101’ ;
exec sql open cur_student;
exec sql fetch cur_student into :vSno, :vSname, :vSclass;
.....
exec sql close cur_student;
- SQL结果的提交与撤销
结果的提交:
exec sql commit work;
结果的撤销:
exec sql rollback work;