四、建立和关闭数据库连接
建立数据库连接格式如下:
EXEC SQL CONNECT
TO target [AS connection-name] [USER user-name];
target是要连接的数据库服务器,可采用如下几种方式:
常见的服务器标识串,如@:;
包含服务器标识的SQL串常量;
DEFAULT。
connect-name是可选的连接名,连接必须是一个有效的标识符。在整个程序内只有一个连接时可以不指定连接名。
关闭数据库连接,格式如下:
EXEC SQL
DISCONNECT [connection];
程序运行过程中可以修改当前连接,格式如下:
EXEC SQL
SET CONNECTION connection-name | DEFAULT;
8.1.3不用游标的SQL语句
不用游标的SQL语句主要有:
说明性语句
数据定义语句
数据控制语句
查询结果为单记录的SELECT语句
非CURRENT形式的增删改语句
一、查询结果为单记录的SELECT语句
这类语句不需要使用游标,只需要用INTO子句指定存放查询结果的主变量。
[例1]
根据学生号码查询学生信息。已经把要查询的学生的学号赋给了主变量givensno。
EXEC SQL SELECT
Sno,Sname,Ssex,Sage,Sdept
INTO :Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM Student
WHERE
Sno=:givensno;
(1)INTO子句、WHERE子句和HAVING短语的条件表达式中均可以使用主变量。
(2)查询返回的记录中,可能某些列为空值NULL,这时需使用指示变量。
(3)如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,RDBMS会在SQLCA中返回错误信息。
[例2]
查询某个学生选修某门课程的成绩。已经把将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。
EXEC SQL SELECT
Sno,Cno,Grade
INTO :Hsno,:Hcno,:Hgrade:Gradeid
/*指示变量Gradeid*/
FROM SC
WHERE Sno=:givensno AND Cno=:givencno;
如果Gradeid
< 0,不论Hgrade为何值,均认为该学生成绩为空值。
二、非CURRENT形式的增删改语句
在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以使用指示变量。[例3]
修改某个学生选修1号课程的成绩。
EXEC SQL
UPDATE SC
SET
Grade=:newgrade /*修改的成绩已赋给主变量*/
WHERE
Sno=:givensno; /*学号赋给主变量givensno*/
[例4]
将计算机系全体学生年龄置NULL值。
Sageid=-1;
EXEC SQL
UPDATE Student
SET Sage=:Raise:Sageid
WHERE Sdept=‘CS’;
将指示变量Sageid赋一个负值后,无论主变量Raise为何值,RDBMS都会将‘CS’系所有学生的年龄置空值。等价于:
EXEC SQL
UPDATE Student
SET Sage=NULL
WHERE Sdept=‘CS';
[例5]
某个学生退学了,现要将有关他的所有选课记录删除掉。假设该学生的姓名已赋给主变量stdname。
EXEC SQL
DELETE
FROM SC
WHERE Sno=
(SELECT Sno
FROM Student
WHERE Sname=:stdname);
[例6]
某个学生新选修了某门课程,将有关记录插入SC表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量couno。
gradeid=-1;
/*用作指示变量,赋为负值*/
EXEC SQL
INSERT
INTO SC(Sno,Cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值。
8.1.4使用游标的SQL语句
必须使用游标的SQL语句包括:
查询结果为多条记录的SELECT语句
CURRENT形式的UPDATE语句
CURRENT形式的DELETE语句
一、查询结果为多条记录的SELECT语句
使用游标的步骤如下:
1.说明游标
使用DECLARE语句,语句格式如下:
EXEC SQL DECLARE
CURSOR FOR ;
它是一条说明性语句,只是说明了游标与SELECT语句相关联,RDBMS并不执行SELECT指定的查询操作。