简答题 4.  假定SERV表有A、B、C三个字段:SERV(A NUMBER(10),B NUMBER(10),C NUMBER(10))。表SERV的内容如下:
A B C
1 10 70
2 30 50
1 10 80
    以下两段PL/SQL的功能是根据A列的值,查找出对应B列的值赋予变量X,请分别判断这两段PL/SQL是否能正常执行,若不能正常执行,请指出错误的原因并修改。
    (1)
   
    (2)
   
【正确答案】这两段程序除了WHERE语句后的值不同以外,其他均一样。对于程序(1),当A=1时,返回了2行记录,对于程序(2),当A=2时,返回了1行记录。对于变量X而言,只能接受一个值,所以,程序2执行不报错,程序(1)执行报错:ORA-01422:exact fetch returns more than requested number of rows。
   对于程序(1)有两种修改方法,第一种就是将“SELECT B INTO X FROM SERV WHERE A=1;”修改为“SELECT DISTINCT B INTO X FROM SERV WHERE A=1;”。第二种方法就是返回集合类型,修改后的程序块如下:
   
【答案解析】