【发布时间】:2020-03-09 21:46:11
【问题描述】:
对于类,我将创建一个名为 add_parts 的存储过程,用于将记录添加到parts_service 表中。它有 2 个与该表中的 part_id 和 parts_qty 字段/数据类型匹配的输入参数。我还必须声明一个变量,该变量将保留来自另一个表服务的 service_id 值,并使用 select into 将其设置为 MAX。这是我的代码:
/*Set DB context and drop the procedure if it exists (2 lines)*/
USE cf;
DROP PROCEDURE IF EXISTS add_parts;
/*Delimiter statement (1 line)*/
DELIMITER //
/*Create procedure statement & 2 int parameters.*/
CREATE PROCEDURE add_parts (
IN part_id_param INT,
IN parts_qty_param INT
)
BEGIN
/*Declare the internal int variable (1 line)*/
DECLARE service_id_var INT;
/*Declare sql_error variable, Declare continue handler, set sql_error variable (3 lines)*/
DECLARE sql_error TINYINT DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET sql_error = TRUE;
/*Set the internal int variable */
/*From the appropriate table (3 lines)*/
SELECT MAX(service_id) INTO service_id_var FROM service;
START TRANSACTION;
/*Insert into parts_service values statement */
INSERT INTO parts_service VALUES(DEFAULT, part_id, part_qty, service_id_var);
/* If/else conditional; if sql_error variable is false, commit the transaction and select the appropriate message*/
/* else, rollback the transaction and select the appropriate message */
IF sql_error = FALSE THEN
COMMIT;
SELECT 'Record was added!' AS Message;
ELSE
ROLLBACK;
SELECT 'The part id you entered does not exist' AS Message;
END IF;
END//
CALL add_parts(15,7);
最后一行的 CALL 应该返回“记录已添加!”而是返回“您输入的零件 ID 不存在”。如何判断我是否正确执行此操作?
CREATE TABLE parts_service (
parts_service_id int(11) NOT NULL AUTO_INCREMENT,
part_id int(11) NOT NULL,
service_id int(11) NOT NULL,
parts_qty int(11) DEFAULT NULL,
PRIMARY KEY (parts_service_id),
KEY ps_fk_parts (part_id),
KEY ps_fk_service (service_id),
CONSTRAINT ps_fk_parts FOREIGN KEY (part_id) REFERENCES parts (part_id),
CONSTRAINT ps_fk_service FOREIGN KEY (service_id) REFERENCES service (service_id)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
【问题讨论】:
-
我建议你看看删除处理程序产生的错误。
parts_service(SHOW CREATE TABLE parts_service) 的表定义是什么? -
创建表
parts_service(parts_service_idint(11) NOT NULL AUTO_INCREMENT,part_idint(11) NOT NULL,service_idint(11) NOT NULL,parts_qtyint( 11)默认NULL,主键(parts_service_id),键ps_fk_parts(part_id),键ps_fk_service(service_id),约束ps_fk_parts外键(part_id)4537(@987)参考987654338@), 约束ps_fk_service外键 (service_id) 参考service(service_id) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci -
删除处理程序时不会产生错误
-
在一个 mysql 客户端中,你能运行这个查询没有错误吗?
INSERT INTO parts_service VALUES (DEFAULT, 15, 7, (SELECT MAX(service_id) FROM service));?如果不是,该错误是否有助于发现问题? -
顺便说一句,请求的信息特别长,如果您更新您的问题以包含此信息会更好。它比 cmets 更容易阅读:-)
标签: mysql stored-procedures transactions