为了账号安全,请及时绑定邮箱和手机立即绑定

使用存储过程报错

存储过程代码与老师写的一样,也能执行,但是

执行CALL execute_seckill(1007,13813813822,NOW(),@r_result);后报错

ERROR 1146 (42S02): Table 'seckill.success_kill' doesn't exist

正在回答

2 回答

我也碰到这个错误,请问解决了吗?

0 回复 有任何疑惑可以回复我~

先在mysql客户端执行下这段sql,创建存储过程。

DROP PROCEDURE IF EXISTS execute_seckill;

-- 秒杀执行存储过程
DELIMITER $$ -- console ";" 转换为 "$$"

-- 定义存储过程
-- 参数:in 输入参数; out 输出参数
CREATE PROCEDURE `seckill`.`execute_seckill`(
  IN v_seckill_id BIGINT ,
  IN v_phone BIGINT ,
  IN v_kill_time TIMESTAMP ,
  OUT r_result INT
)
  BEGIN
    -- insert_count 临时变量定义(需要在事物开始之前定义)
    DECLARE insert_count INT DEFAULT 0 ;
    START TRANSACTION ;
    INSERT IGNORE INTO success_killed(
    seckill_id ,
    user_phone ,
    create_time
    ) VALUES (
      v_seckill_id ,
      v_phone ,
      v_kill_time
    ) ;
    -- row_count():返回上一条修改类型sql(delete,insert,upodate)的影响行数
    -- row_count: 0:未修改数据; >0:表示修改的行数; <0:sql错误/未执行修改sql
    SELECT ROW_COUNT() INTO insert_count ;
    IF (insert_count = 0) THEN
      ROLLBACK ;
      -- 设置满足业务逻辑需要的返回结果 r_result
      SET r_result = - 1 ;
    ELSEIF (insert_count < 0) THEN
      ROLLBACK ;
      SET r_result = - 2 ;
    ELSE
      UPDATE seckill
      SET number = number - 1
      WHERE
        seckill_id = v_seckill_id
        AND end_time > v_kill_time
        AND start_time < v_kill_time
        AND number > 0 ;
      -- 再次使用 row_count()
      SELECT ROW_COUNT() INTO insert_count ;
      IF (insert_count = 0) THEN
        ROLLBACK ;
        SET r_result = 0 ;
      ELSEIF (insert_count < 0) THEN
        ROLLBACK ;
        SET r_result = - 2 ;
      ELSE
        COMMIT ;
        SET r_result = 1 ;
      END IF ;
    END IF ;
  END ;
$$
-- 代表存储过程定义结束


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java高并发秒杀API之高并发优化
  • 参与学习       78600    人
  • 解答问题       170    个

Java实现高并发秒杀API的第四门课,小伙伴一定可以从中受益

进入课程

使用存储过程报错

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信