declare a sc.s#%type;为什么'sc' 不是可以识别的 CURSOR 选项。
时间: 2024-03-25 18:39:29 浏览: 25
对于 PL/SQL 中的 DECLARE 语句,它主要用于声明变量、常量、游标、子程序等,并进行类型定义。在这里,"sc" 并不是游标选项,而是一个表名。因此,如果你想要声明一个游标,应该使用如下形式:
```
DECLARE
cursor_name CURSOR IS SELECT column_name FROM table_name;
```
其中,cursor_name 是你想要定义的游标名称,SELECT column_name FROM table_name 是你想要查询的语句。在这个游标中,你可以使用 FETCH 语句来获取查询结果集中的数据,并对其进行操作。而在你的代码中,因为没有正确定义游标,所以会导致语法错误。
相关问题
请帮我修改代码:create procedure sname_grade(in v_sname varchar(20)) begin declare v_sc.sno varchar(20); declare v_sc.cno varchar(20); declare v_grade int; declare v_level varchar(10); declare flag int default 1; declare c1 cursor for select sc.sno,sc.cno,grade,level from sc,student where sc.sno=student.sno and sname=v_sname; declare continue handler for not found set flag=0; open c1; while flag do fetch c1 into v_sc.sno,v_sc.cno,v_grade,v_level; if v_grade>=85 and v_grade<=100 then set v_level='A'; elseif v_grade>=75 and v_grade<=84 then set v_level='B'; elseif v_grade>=65 and v_grade<=74 then set v_level='C'; elseif v_grade>=60 and v_grade<=64 then set v_level='D'; else set v_level='E'; end if; update sc set level=v_level where cno=v_sc.cno and sno=v_sc.sno; end while; close c1; end;
下面是修改后的代码:
```
CREATE PROCEDURE sname_grade(IN v_sname VARCHAR(20))
BEGIN
DECLARE v_sc_sno VARCHAR(20);
DECLARE v_sc_cno VARCHAR(20);
DECLARE v_grade INT;
DECLARE v_level VARCHAR(10);
DECLARE flag INT DEFAULT 1;
DECLARE c1 CURSOR FOR SELECT sc.sno, sc.cno, grade, level FROM sc, student WHERE sc.sno = student.sno AND sname = v_sname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 0;
OPEN c1;
WHILE flag DO
FETCH c1 INTO v_sc_sno, v_sc_cno, v_grade, v_level;
IF v_grade >= 85 AND v_grade <= 100 THEN
SET v_level = 'A';
ELSEIF v_grade >= 75 AND v_grade <= 84 THEN
SET v_level = 'B';
ELSEIF v_grade >= 65 AND v_grade <= 74 THEN
SET v_level = 'C';
ELSEIF v_grade >= 60 AND v_grade <= 64 THEN
SET v_level = 'D';
ELSE
SET v_level = 'E';
END IF;
UPDATE sc SET level = v_level WHERE cno = v_sc_cno AND sno = v_sc_sno;
END WHILE;
CLOSE c1;
END;
```
主要的修改如下:
1. 增加了 BEGIN 和 END,将存储过程的主体包含在内。
2. 在变量声明中,将 v_sc.sno 和 v_sc.cno 改为 v_sc_sno 和 v_sc_cno。
3. 将 SELECT 语句中的 AND 改为 WHERE。
4. 将 FETCH 语句中的 INTO 子句中的 v_sc.sno 和 v_sc.cno 改为 v_sc_sno 和 v_sc_cno。
5. 将 IF 语句中的 THEN 和 ELSEIF 改为 THEN 和 ELSE IF。
6. 将 UPDATE 语句中的 WHERE 条件中的 v_sc.cno 和 v_sc.sno 改为 v_sc_cno 和 v_sc_sno。
希望这些修改可以帮助你解决问题。
给下面的代码纠错:create procedure student_score_by_name(in v_sname varchar(20)) begin declare v_sno,v_cno varchar(20); declare v_grade int; declare v_level varchar(10); declare flag int default 1; declare c1 cursor for select sc.sno,cno,grade, level from student,sc where student.sno=sc.sno and sname=v_sname; declare continue handler for not found set flag=0; open c1; while flag do fetch c1 into v_sno,v_cno,v_grade,v_level; if isnull(v_level) then if v_grade between 85 and 100 then set level='A'; elseif v_grade between 75 and 84 then set level='B'; elseif v_grade between 65 and 74 then set level='C'; elseif v_grade between 60 and 64 then set level='D'; else set level='F'; end if; update sc set level=v_level where sno=v_sno and cno=v_cno; end if; end while; close c1; end;
下面是已经纠错的代码:
```
CREATE PROCEDURE student_score_by_name(in v_sname varchar(20))
BEGIN
DECLARE v_sno, v_cno varchar(20);
DECLARE v_grade int;
DECLARE v_level varchar(10);
DECLARE flag int default 1;
DECLARE c1 CURSOR FOR SELECT sc.sno, cno, grade, level FROM student, sc
WHERE student.sno = sc.sno AND sname = v_sname;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 0;
OPEN c1;
WHILE flag DO
FETCH c1 INTO v_sno, v_cno, v_grade, v_level;
IF isnull(v_level) THEN
IF v_grade BETWEEN 85 AND 100 THEN SET v_level = 'A';
ELSEIF v_grade BETWEEN 75 AND 84 THEN SET v_level = 'B';
ELSEIF v_grade BETWEEN 65 AND 74 THEN SET v_level = 'C';
ELSEIF v_grade BETWEEN 60 AND 64 THEN SET v_level = 'D';
ELSE SET v_level = 'F';
END IF;
UPDATE sc SET level = v_level WHERE sno = v_sno AND cno = v_cno;
END IF;
END WHILE;
CLOSE c1;
END;
```
主要的问题是:
1. 缺少 BEGIN 和 END,需要在创建存储过程时加上。
2. CURSOR 声明语句中 SELECT 语句缺少表别名。
3. isnull() 函数应该写成 IS NULL。
4. 在 IF 语句中,变量名应该是 v_level,而不是 level。
5. 在 END IF 和 END WHILE 后面需要加上分号。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)