SQL语言提供两种不同使用方式:交互式、嵌入式
SQL语言是非过程性语言,事务处理应用需要高级语言,所以引入嵌入式SQL
嵌入式SQL是将SQL语言嵌入到程序设计语言中,被嵌入语言称为宿主语言或主语言,处理过程采用预编译方法。
为了区分SQL语句和主语言语句,所有SQL语句必须加入前缀EXEC SQL
SQL语句:
高级语言语句:
数据库工作单元与源程序工作单元之间的通信:
SQLCA是一个数据结构:
定义SQLCA
用EXEC SQL INCLUDE SQLCA定义
使用SQLCA
SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE
如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错
应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理
嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据
在SQL语句中使用的主语言程序变量称为主变量
主变量类型:输入主变量、输出主变量
指示变量(整型变量):指示输入主变量是否为空值、检测输出变量是否为空置,值是否被截断
使用主变量
说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现
为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志
使用指示变量
指示变量前也必须加冒号标志
必须紧跟在所指主变量之后
SQL语言面向集合,一条语句原则可以产生或处理多条记录
主语言面向记录,一组主变量只能存放一条记录
嵌入式SQL引入游标概念来协调这两种不同处理方式
游标:
1)建立数据库连接
EXEC SQL CONNECT TO target[AS connection-name][USER user-name];
target是要连接的数据库服务器
常见的服务器标识串,如<dbname>@<hostname>:<port>
包含服务器标识的SQL串常量
DEFAULT
connect-name是可选的连接名,连接名必须是一个有效的标识符
在整个程序内只有一个连接时可以不指定连接名
程序运行过程中可以修改当前连接
EXEC SQL SET CONNECTION connection-name|DEFAULT;
(2)关闭数据库连接
EXEC SQL DISCONNECT [connection];
依次检查某个系的学生记录,交互式更新某些学生年龄。
EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/
char Deptname[20];
char Hsno[9];
char Hsname[20];
char Hssex[2];
int HSage;
int NEWAGE;
EXEC SQL END DECLARE SECTION; /*主变量说明结束*/
long SQLCODE;
EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/
int main(void) /*C语言主程序开始*/
{
int count = 0;
char yn; /*变量yn代表yes或no*/
printf("Please choose the department name(CS/MA/IS): ");
scanf("%s",deptname); /*为主变量deptname赋值*/
EXEC SQL CONNECT TO TEST@localhost:54321 USER
"SYSTEM"/"MANAGER"; /*连接数据库TEST*/
EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
SELECT Sno,Sname,Ssex,Sage /*SX对应的语句*/
FROM Student
WHERE SDept = :deptname;
EXEC SQL OPEN SX; /*打开游标SX,指向查询结果的第一行*/
不使用游标SQL语句种类:说明性语句、数据定义语句、数据控制语句、查询结果为单记录的SELECT语句、非CURRENT形式的增删改语句
EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept
INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM Student
WHERE Sno=:givensno;
/*把要查询的学生的学号赋给为了主变量givensno*/
面向集合操作,一次修改或删除所有满足条件记录
EXEC SQL UPDATE SC
SET Grade=:newgrade
/*修改的成绩已赋给主变量:newgrade*/
WHERE Sno=:givensno;
/*学号赋给主变量:givensno*/
①说明游标
EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;
说明性语句,未执行SELECT
②打开游标
EXEC SQL OPEN <游标名>;
执行SELECT语句,查询结果取到缓冲区
③推进游标指针并取当前记录
EXEC SQL FETCH <游标名>
INTO <主变量>[<指示变量>]
[,<主变量>[<指示变量>]]...;
④关闭游标
EXEC SQL CLOSE <游标名>;
程序主变量包含的内容是SQL语句的内容
SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行
SQL语句中的可变元素
使用参数符号(?)表示该位置的数据在运行时设定
①条件控制
②循环控制
③错误控制
运行效率搞、降低客户机和服务器的通信量、方便实施企业规划
①创建存储过程
②执行存储过程
③修改存储过程
④删除存储过程
函数和存储过程的异同:
①函数定义
②函数执行
③修改函数