嵌入式SQL与存储过程
嵌入式SQL
SQL提供了将SQL语句嵌入到某种高级语言中的方式,通常采用预编译的方法。
1、区分主语言与SQL语句的方式:
EXEC SQL <SQL语句>
2、向主语言传递SQL语句执行的状态信息的方式:
SQLCA,即SQL通信区,是系统默认定义的全局变量。
3、主变量(共享变量): • 主语言通过主变量向SQL语句提供参数,主变量是由主语言的程序定义的,并用SQL的DECLARE语句
说明。 • 在SQL语句中,为了与SQL中的属性名区分,在引用共享变量时,前面需要加“:”.
嵌入式SQL例:
EXEC SQL BEGIN DECLARE SECTION; char Msname[4], Msex[3], givensno[5]; int Mage; char SQLSTATE[6]; //特殊的共享变量,解释SQL语句的执行状况 EXEC SQL END DECLARE SECTION;
(1)根据共享变量givensno值查询学生关系students中学生的姓名、年龄和性别。
EXEC SQL SELECT sname,age,sex INTO :Msname, :Mage, :Msex FROM students WHERE sno = :givensno;
(2)某学生选修了一门课程,将其插入学生选课表SC中,假设学号、课程号、成绩已分别赋给主变量HSno、
Hcno 和 Hgrade。
EXEC SQL INSERT INTO SC(Sno,Cno,Grade) Values (:HSno, :HCno, :Hgrade);
游标
SQL语言是面向集合的,一条SQL语句可以产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能放一条记录,所以,引入游标,通过移动游标指针来决定获取哪一条记录。
1、定义游标:
语句格式: EXEC SQL DECLARE <游标名称> CURSOR FOR
<SELECT语句> • 它只是一条说明性语句,定义游标后,其中的SELECT语句并不执行。
2、打开游标:
语句格式: EXEC SQL OPEN <游标名称> • 该语句执行游标定义中的SELECT语句,同时游标处于活动状态。游标是一个指针,此时指向查询结果的第一
行之前。
3、推进游标:
语句格式: EXEC SQL FETCH 游标名 INTO 变量表 • 该语句执行时,游标推进一行,并把游标指向的行(称为当前行)中的值取出,送到共享变量中。
4、关闭游标: EXEC SQL CLOSE 游标名 • 该语句关闭游标,使它不再和查询结果相联系。游标关闭后,后面还可以再打开。
存储过程
• 存储过程(Procedure):是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
• 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
• 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。
• 语句格式:
CREATE PROCEDURE 存储过程名(IN|OUT|IN OUT 参数1 数据类型,IN|OUT|IN OUT 参数2 数据类型…) [AS] //参数的数据类型只需要指明类型名即可,不需要指定宽度。具体宽度由外部调用者决定 BEGIN <SQL语句> END IN:为默认值,表示该参数为输入型参数,在过程体中值一般不变。 OUT:表示该参数为输出参数,可以作为存储过程的输出结果,供外部调用者使用。 IN OUT: 既可作为输入参数,也可作为输出参数。