第四节 视 图 (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)
使用注意事项:
1. 使用主变量:INTO子句;WHERE子句的条件表达式;HAVING短语的条件表达式。
2. 使用指示变量:指示变量只能用于INTO子句中,如果INTO子句中主变量后面跟有指示变量,则当查
询得出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,但不向该主变量执行赋
值操作,即主变量值仍保持执行SQL语句之前的值。当发现指示变量值为负值时,不管主变量为何值,均应
认为主变量值为NULL。
3. 查询结果为空集:如果数据库中没有满足条件的记录,即查询结果为空,则DBMS将SQLCODE的值置为
100。
4. 查询结果为多条记录:程序出错,DBMS会在SQLCA中返回错误信息。
例 根据学生号码查询学生信息。
假设已将要查询的学生的学号赋给了主变量givensno。
EXEC SQL SELECT Sno, Sname, Ssex, Sage, Sdept
INTO :Hsno, :Hname, :Hsex, :Hage, :Hdept
FROM Student
WHERE Sno=:givensno;
Hsno, Hname, Hsex, Hage, Hdept和givensno均是主变量,并均已在前面的程序中说明过了。
例 查询某个学生选修某门课程的成绩。
假设已将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量givencno。
EXEC SQL SELECT Sno, Cno, Grade
INTO :Hsno, :Hcno, :Hgrade:Gradeid
FROM SC
WHERE Sno=:givensno AND Cno=:givencno;
从提高应用程序的数据独立性角度考虑,SELECT语句在任何情况下都应该使用游标,对于仅返回一行结
果数据的SELECT语句虽然可以不使用游标。但如果以后数据库改变了,该SELECT语句可能会返回多行数据,
这时该语句就会出错。
五、非CURRENT形式的UPDATE语句
非CURRENT形式的UPDATE语句,使用主变量、SET子句、WHERE子句、使用指示变量、SET子句、非CURRENT
形式的UPDATE语句可以操作多条元组。
例 将全体学生1号课程的考试成绩增加若干分。
假设增加的分数已赋给主变量Raise
EXEC SQL UPDATE SC
SET Grade=Grade+:Raise
WHERE Cno='1';
六、非CURRENT形式的DELETE语句
非CURRENT形式的DELETE语句,
使用主变量、WHERE子句、非CURRENT形式的DELETE语句可以操作多条元
组。
例 某个学生退学了,现要将有关他的所有选课记录删除掉。
假设该学生的姓名已赋给主变量stdname
EXEC SQL DELETE
FROM SC
WHERE Sno = ( SELECT Sno
FROM Student
WHERE Sname=:stdname);
七、INSERT语句
非CURRENT形式的INSERT语句,使用主变量, VALUES子句、使用指示变量, VALUES子句、非CURRENT形式
的INSERT语句一次只能输入一条元组。
例 某个学生新选修了某门课程,将有关记录插入SC表。
假设学生的学号已赋给主变量stdno,课程号已赋给主变量couno。
gradeid=-1;
EXEC SQL INSERT INTO SC(Sno, Cno, Grade)
VALUES(:stdno, :couno, :gr:gradeid);
由于该学生刚选修课程,尚未考试,因此成绩列为空。所以本例中用指示变量指示相应的主变量为空值。
|