delimiter // create PROCEDURE usp_randCardID() BEGIN @cardid=concat('10103576',right(rand(),8)); END //哪里错了
时间: 2024-01-14 08:02:27 浏览: 36
在这个存储过程中,虽然语法没有错误,但是缺少了输出参数或 SELECT 语句,导致无法获取生成的银行卡号。你可以将存储过程修改为带有输出参数的形式,例如:
```
delimiter //
create PROCEDURE usp_randCardID(OUT cardid VARCHAR(16))
BEGIN
SET cardid = concat('10103576',right(rand(),8));
END //
```
在这个修改后的存储过程中,我们添加了一个名为 `cardid` 的输出参数,用于将生成的银行卡号返回给调用方。在存储过程中,我们将生成的银行卡号存储到该输出参数中,然后可以通过 `CALL` 语句来调用它,例如:
```
CALL usp_randCardID(@cardid);
SELECT @cardid;
```
第一条语句用于调用存储过程,并将生成的银行卡号存储到 `@cardid` 变量中。第二条语句则用于查询该变量的值,以查看生成的银行卡号。
相关问题
delimiter // create PROCEDURE usp_randCardID() BEGIN @cardid=concat('10103576',right(rand(),8)); END //
这是一个 MySQL 存储过程的示例,用于生成随机的银行卡号。下面是对代码的解释:
- `delimiter //` 语句用于更改语句分隔符,避免存储过程中的分号与 SQL 语句中的分号冲突。
- `create PROCEDURE usp_randCardID()` 语句用于创建一个名为 usp_randCardID 的存储过程。
- `BEGIN` 语句用于标记存储过程的开始。
- `@cardid=concat('10103576',right(rand(),8));` 语句用于生成随机的银行卡号。其中,`rand()` 函数用于生成一个 0 到 1 之间的随机浮点数,`right()` 函数用于获取该浮点数的后 8 位数字,最后使用 `concat()` 函数将这 8 位数字与一个固定的前缀字符串 '10103576' 连接起来,得到一个长度为 16 的银行卡号。`@cardid` 则是一个 MySQL 变量,用于存储生成的银行卡号。
- `END` 语句用于标记存储过程的结束。
这个存储过程可以使用 `CALL` 语句来执行,例如:
```
CALL usp_randCardID();
SELECT @cardid;
```
第一条语句用于调用存储过程,生成一个随机银行卡号并存储到 `@cardid` 变量中。第二条语句则用于查询该变量的值,以查看生成的银行卡号。
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 ;
```
另外,如果这段代码存在其他问题,还需要针对具体问题进行修改。
阅读全文