DELIMITER $$ DROP PROCEDURE IF EXISTS `InspectionResult`$$ CREATE PROCEDURE `xtjw`.`InspectionResult`(aSubmitCorp varCHAR(50),aYear int(10)) BEGIN DECLARE cydbazbTable VARCHAR(50); DECLARE aIndexNO varchar(50); DECLARE my_cursor CURSOR FOR SELECT aIndexNO FROM xtjw.cyd WHERE SubmitCorp=aSubmitCorp AND YEAR(DateOrder)=aYear; OPEN my_cursor; FETCH NEXT FROM my_cursor INTO aIndexNO; WHILE @@FETCH_STATUS = 0 do select * from xtjw.cyd where IndexNO = aIndexNO; END WHILE; CLOSE my_cursor; DEALLOCATE my_cursor; END$$ DELIMITER ;报错
时间: 2024-02-14 16:08:57 浏览: 147
MySQL 5.7 create VIEW or FUNCTION or PROCEDURE
在这段代码中,存在以下几个问题:
1. `FETCH NEXT` 语句中应该使用 `INTO` 子句将查询结果存储到变量中,否则会出现“Unknown column 'aIndexNO' in 'where clause'” 的错误。
2. 在 `SELECT` 语句中,使用了未声明的变量 `cydbazbTable`。
3. `WHILE` 循环中缺少了 `FETCH NEXT` 语句,导致循环陷入死循环。
以下是修改后的代码:
```
DELIMITER $$
DROP PROCEDURE IF EXISTS `InspectionResult`$$
CREATE PROCEDURE `xtjw`.`InspectionResult`(aSubmitCorp VARCHAR(50), aYear INT(10))
BEGIN
DECLARE aIndexNO VARCHAR(50);
DECLARE my_cursor CURSOR FOR
SELECT aIndexNO FROM xtjw.cyd WHERE SubmitCorp = aSubmitCorp AND YEAR(DateOrder) = aYear;
OPEN my_cursor;
FETCH NEXT FROM my_cursor INTO aIndexNO;
WHILE @@FETCH_STATUS = 0
DO
SELECT * FROM xtjw.cyd WHERE IndexNO = aIndexNO;
FETCH NEXT FROM my_cursor INTO aIndexNO;
END WHILE;
CLOSE my_cursor;
DEALLOCATE my_cursor;
END$$
DELIMITER ;
```
在上面的代码中,我们将 `cydbazbTable` 变量移除,并将需要查询的 `IndexNO` 值存储到 `aIndexNO` 变量中。然后,我们使用 `WHILE` 循环来遍历游标中的结果集,并在循环体中使用 `SELECT` 语句来查询需要的数据。在循环体中加入了 `FETCH NEXT` 语句,以便在每次循环中更新游标中的结果集。最后,我们需要使用 `CLOSE` 和 `DEALLOCATE` 语句来关闭游标并释放其占用的资源。
阅读全文