【问题标题】:Stored Procedure in mySQL issuesmySQL 中的存储过程问题
【发布时间】: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_id int(11) NOT NULL AUTO_INCREMENT, part_id int(11) NOT NULL, service_id int(11) NOT NULL, parts_qty int( 11)默认NULL,主键(parts_service_id),键ps_fk_partspart_id),键ps_fk_serviceservice_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


【解决方案1】:

啊哈,这两个不正常:

service_id int(11) NOT NULL,
parts_qty int(11) DEFAULT NULL,

在尝试将parts_qty 插入service_id 时,查询(对service 表有约束)一定会失败。

将您的插入切换到此:

INSERT INTO parts_service VALUES(DEFAULT, part_id, service_id_var, part_qty);

或者,这可能更好,您可以明确设置您的值要放入的列:

INSERT INTO parts_service 
  (`parts_service_id`, `part_id`, `parts_qty`, `service_id`) 
VALUES
  (DEFAULT, part_id, part_qty, service_id_var);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2022-01-24
    • 2014-08-17
    • 1970-01-01
    • 2011-06-16
    • 2016-10-28
    • 2020-03-08
    相关资源
    最近更新 更多