delimiter // create procedure zhro() begin declare no char(8); declare name char(8); declare zr cursor for select sname from student; open zr; fetch zr into name; select name as 姓名; close zr; end // delimiter; call zhro();什么意思
时间: 2024-04-03 20:30:37 浏览: 44
这段代码是创建了一个名为 "zhro" 的存储过程,其中包含一个游标 "zr",该游标用于查询 "student" 表中的 "sname" 列,并将结果存储在名为 "name" 的变量中。然后,通过打开游标、获取游标结果、显示结果和关闭游标的操作,将查询结果输出到控制台。
最后,通过调用 "zhro" 存储过程,执行上述操作并输出查询结果。这个存储过程的作用是查询 "student" 表中的所有学生姓名,并将其输出到控制台。
相关问题
DELIMITER // CREATE PROCEDURE usp_openAccount(IN cName char(8), IN PID VARchar(18),IN tel char(20), IN oMoney decimal(20,2),IN sName VARchar(20),IN addr varchar(50)) BEGIN DECLARE sID INT; DECLARE cur_id INT; SELECT savingID INTO sID FROM depoist WHERE savingName= sName; CALL usp_randCardID(@cardId); INSERT INTO userInfo(customerName,PID,telephone,address ) VALUES(cName,PID,tel,addr); SELECT customerID INTO cur_id FROM userInfo WHERE customerName=CName; INSERT INTO cardInfo(cardID,savingID,openMoney,balance,customerID) VALUES(@cardId,sID,oMoney,openMoney,cur_ID); END // DELIMITER ; select * from view_userInfo ORDER BY `客户编号`; select * from view_customerid ORDER BY `客户名字`; CALL usp_openAccount('王小六','554455881017878153','0999-67891234',1,'活期','山东某某市'); select * from view_userInfo ORDER BY `客户名字`; select * from view_cardInfo ORDER BY `客户名字`;哪里有问题
这段代码中存在以下问题:
1. 存储过程中的变量声明不完整,缺少了一部分。
2. 存储过程中的参数名与调用时的参数名不一致,需要保持一致。
3. 存储过程中的第7行应该是 `SELECT savingID INTO sID FROM deposit WHERE savingName = sName;`,而不是 `SELECT savingID INTO sID FROM depoist WHERE savingName= sName;`,存在拼写错误。
4. 存储过程中的第8行应该是 `CALL usp_randCardID(@cardId);`,而不是 `CALL usp_randCardID(cardId);`,需要添加 `@` 符号。
5. 存储过程中的第11行应该是 `INSERT INTO cardInfo(cardID,savingID,openMoney,balance,customerID) VALUES(@cardId,sID,oMoney,oMoney,cur_id);`,而不是 `INSERT INTO cardInfo(cardID,savingID,openMoney,balance,customerID) VALUES(@cardId,sID,oMoney,openMoney,cur_ID);`,需要将 `openMoney` 改为 `oMoney`,因为 `openMoney` 并没有定义。
6. 存储过程中的变量名需要保持一致,例如 `cur_id` 和 `CName` 应该都是小写。
7. 存储过程中的第2行和第3行的变量类型应该保持一致,例如 `IN PID varChar(18)` 应该改为 `IN PID varchar(18)`。
修改后的代码如下:
```
DELIMITER //
CREATE PROCEDURE usp_openAccount(
IN cName VARCHAR(8),
IN pID VARCHAR(18),
IN tel VARCHAR(20),
IN oMoney DECIMAL(20,2),
IN sName VARCHAR(20),
IN addr VARCHAR(50)
)
BEGIN
DECLARE v_sID INT;
DECLARE v_cur_id INT;
SELECT savingID INTO v_sID FROM deposit WHERE savingName = sName;
CALL usp_randCardID(@cardId);
INSERT INTO userInfo(customerName, PID, telephone, address) VALUES(cName, pID, tel, addr);
SELECT customerID INTO v_cur_id FROM userInfo WHERE customerName = cName;
INSERT INTO cardInfo(cardID, savingID, openMoney, balance, customerID) VALUES(@cardId, v_sID, oMoney, oMoney, v_cur_id);
END//
DELIMITER ;
```
同时,最后一行的存储过程调用也应该添加 `DELIMITER` 和 `CALL` 语句,如下所示:
```
DELIMITER //
CALL usp_openAccount('王小六', '554455881017878153', '0999-67891234', 1, '活期', '山东某某市');
DELIMITER ;
```
另外,如果这段代码存在其他问题,还需要针对具体问题进行修改。
请问能否用MYSQL存储过程实现已知入参T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串 学生表student(sName varchar(100)COMMENT姓 名iSocreINT(11)COMMENT 成绩) 用循环方式
可以使用MYSQL存储过程来实现已知入参T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串,循环插入学生表student中。以下是一个示例代码:
DELIMITER $$
CREATE PROCEDURE insert_students(IN names VARCHAR(100))
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE name VARCHAR(100);
DECLARE names_array JSON;
SET names_array = JSON_EXTRACT(names, '$');
WHILE i <= JSON_LENGTH(names_array) DO
SET name = JSON_EXTRACT(names_array, CONCAT('$[', i-1, ']'));
INSERT INTO student(sName, iSocre) VALUES (name, 0);
SET i = i + 1;
END WHILE;
END$$
DELIMITER ;
调用存储过程时,将T"sName":"姓名1”["sName""姓名2”"sName"·"姓名3”]字符串作为参数传递给存储过程即可:
CALL insert_students('{"sName":"姓名1","sName":"姓名2","sName":"姓名3"}');
这将在学生表中插入三个学生记录,姓名分别为"姓名1"、"姓名2"和"姓名3",成绩默认为0。
阅读全文