mysql 存储过程

文章介绍了MySQL存储过程的概念,它是预编译的数据库代码,用于执行复杂的业务逻辑和提高数据库性能。文中通过创建和更新员工薪水的示例,展示了如何定义存储过程,包括参数处理、错误检查及日志记录。同时,提到了SQLSTATE45000作为用户定义异常的错误码。
摘要由CSDN通过智能技术生成

chatgpt的回答:

MySQL 存储过程是一种在 MySQL 数据库中定义和执行的一段预编译的数据库代码。它可以接受参数、执行 SQL 查询和 DML(数据操作语言)语句,以及包含控制结构和错误处理逻辑。存储过程常常用于实现复杂的业务逻辑,提高数据库性能和安全性。

举例:

-- 创建 employees 表
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- 创建 salary_log 表
CREATE TABLE salary_log (
    log_id INT PRIMARY KEY AUTO_INCREMENT,
    employee_id INT,
    old_salary DECIMAL(10, 2),
    new_salary DECIMAL(10, 2),
    log_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (employee_id) REFERENCES employees (employee_id)
);

-- 插入测试数据
INSERT INTO employees (employee_id, first_name, last_name, salary)
VALUES (1001, 'John', 'Doe', 5000),
       (1002, 'Jane', 'Smith', 5500),
       (1003, 'David', 'Johnson', 6000);

 

-- 创建存储过程
DELIMITER //

CREATE PROCEDURE update_salary(IN emp_id INT, IN new_salary DECIMAL(10, 2))
BEGIN
    DECLARE emp_count INT;
    DECLARE salary DECIMAL(10, 2);

    -- 检查员工是否存在
    SELECT COUNT(*) INTO emp_count FROM employees WHERE employee_id = emp_id;
    IF emp_count = 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '员工不存在';
    END IF;

    -- 获取当前薪水
    SELECT salary INTO salary FROM employees WHERE employee_id = emp_id;

    -- 更新薪水
    UPDATE employees SET salary = new_salary WHERE employee_id = emp_id;

    -- 记录薪水变更日志
    INSERT INTO salary_log (employee_id, old_salary, new_salary) VALUES (emp_id, salary, new_salary);
END //

DELIMITER ;

SQLSTATE '45000' 是 MySQL 中的一个错误码,表示用户定义的异常。它表示在 SQL 语句的执行过程中,发生了一个与用户定义的异常相关的错误。

在 MySQL 中,SQLSTATE 是一个标准的 SQL 错误状态码,用于表示不同类型的错误。SQLSTATE 由 5 个字符组成,第一个字符表示错误类别,后四个字符表示错误的具体子类。

对于 SQLSTATE '45000',其错误类别为 '45',表示用户定义的异常。这意味着在 MySQL 中,发生了与用户定义的异常相关的错误。具体的错误子类 '000' 可能是用户在编写自定义异常处理程序时定义的特定错误代码

需要注意的是,SQLSTATE '45000' 只是一个通用的错误码,具体的含义和处理方式取决于用户自定义的异常处理逻辑和应用程序的实现。在实际使用中,用户应该根据其应用程序的需求和业务逻辑,定义和处理自己的异常,并根据实际情况处理错误。

 以上代码首先创建了两个表:employees 表和 salary_log 表,使用 INSERT INTO 语句插入了一些测试数据到 employees 表中。然后创建了一个名为 update_salary 的存储过程。存储过程包括了参数的接收、员工存在性的检查、薪水的更新以及薪水变更日志的记录

这只是一个简单的示例,实际上存储过程可以包含更复杂的业务逻辑,根据实际需求进行设计。存储过程可以在 MySQL 数据库中使用 CALL 语句进行调用。

下面是如何调用该存储过程的示例:

CALL update_salary(1002, 5500);
CALL update_salary(1002, 4000);

 select * from employees;

 select * from salary_log


 employee_id=1000不存在:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值