delimiter // create procedure count_1(in s_sname varchar(30),out count_sname char) begin select count(sname) as 总人数 into count_sname from student where sname=s_sname; End// delimiter; call count_1(@count_sname); select @count_sname as 总人数; MySQL错在哪里
时间: 2024-02-03 22:12:39 浏览: 24
在调用存储过程时,应该将存储过程的参数传递给它,即应该像下面这样调用存储过程:
```
delimiter //
create procedure count_1(in s_sname varchar(30),out count_sname char)
begin
select count(sname) as 总人数 into count_sname from student where sname=s_sname;
End//
delimiter;
call count_1('张三', @count_sname);
select @count_sname as 总人数;
```
请注意,`count_1` 存储过程有一个输入参数 `s_sname` 和一个输出参数 `count_sname`。在调用存储过程时,应该将 `s_sname` 参数传递给它。在存储过程内部,使用 `into` 关键字将 `count(sname)` 的结果赋值给 `count_sname`。最后,在查询中,可以使用 `@count_sname` 查看输出参数的值。
相关问题
CREATE PROCEDURE AVG_Score(IN sname varchar(8),OUT OUTCName varchar(8),OUT grade DECIMAL(5,2)) BEGIN SELECT FROM course,student,sc WHERE CName=sname; SELECT AVG(grade) INTO grade FROM sc,(SELECT CNo TCNo FROM course WHERE CName=cname) AS T WHERE TCNo=TCNo GROUP BY con; END// DELIMITER ; CALL AVG_Score("数学",@OUTCName,@Score);
根据您提供的代码,这是一个计算某门课程所有学生平均成绩的存储过程,输入参数为课程名称(sname),输出参数为课程名称(OUTCName)和平均成绩(grade)。
以下是对代码的一些修正和说明:
```sql
CREATE PROCEDURE AVG_Score(IN sname VARCHAR(8), OUT OUTCName VARCHAR(8), OUT grade DECIMAL(5,2))
BEGIN
SELECT CName INTO OUTCName FROM course WHERE CName = sname; -- 查询课程名称
SELECT AVG(Grade) INTO grade -- 计算平均成绩
FROM sc
WHERE SC.CNo = (SELECT CNo FROM course WHERE CName = sname); -- 查询课程编号,统计成绩
END;
```
修正说明:
- 在第一行缺少了 `DELIMITER //`,需要添加;
- 在第二行的 `SELECT` 语句中,没有指定查询的字段,需要添加 `CName`;
- 在第三行的 `SELECT` 语句中,`WHERE` 子句需要指定 `SC.CNo`;
- 在第四行的 `GROUP BY` 子句中,应该使用 `CNo` 而不是 `con`。
使用 `CALL` 语句来调用存储过程并获取输出参数:
```sql
CALL AVG_Score('数学', @OUTCName, @Score);
SELECT @OUTCName, @Score;
```
希望这些修正和说明能够帮助您解决问题。如果您还有其他问题,请随时提出。
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 ;
```
另外,如果这段代码存在其他问题,还需要针对具体问题进行修改。