利用navicat写mysql的存储过程

本文介绍如何在Navicat中创建存储过程,并详细解释了定义变量、赋值操作、查询结果赋值及返回结果集等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目经理让我给新的活动的预留一个插入红包和查看详情的sql,方便在项目出问题的做一些紧急操作,我想了下这里面还涉及到挺多逻辑和挺多表的一句句查也不方便啊,干脆写到存储过程里,于是开始在navicat写存储过程,因为是第一次写,在此记录一下,方便下次查看 (•̀ᴗ•́)و ̑̑

1:选择新建函数。

2:新建函数后会出现下面的界面,要是你不确定存储过程的输入输出值,可以直接点击完成,在里面的编辑的时候再加上这些参数,若是已经确定参数可以点击下一步填写相关参数。


3:如果上一步点击的是下一步的话,就会出现下面的界面,各个参数的含义在界面右面的描述中有,其实用惯的也能猜出来,模式的命名也是见名知意的。

IN:存储过程运行时需要输入的参数,也就是入参。

OUT:储存过程运行后的返回值,也就是出参。

INOUT:既是入参也是出参。


4:填完后点确认就会有下面的界面,navicat会给我们初识化好基本格式,如下:


5:现在我们就可以在begin和end直接编辑我们的语句,下面介绍存储过程中常用的操作。

1):定义一个变量如下,使用 DECLARE修饰变量,后面跟变量名,变量的数据类型和大小;

DECLARE u1  bigint(20);

2):有了变量,我们就可以开始做赋值操作,先来个简单的单个变量的赋值,如下直接使用SET变量名前使用@修饰,可以直接赋值也可以将入参赋值给变量,如下,将入参userId赋值给变量u1;

SET @u1 = 89893;
SET @u1 = userId;

3):我们还可以将查询语句的结果赋值给变量如下,使用同单个变量的赋值类似,只需将查询的查询sql括起来就好了;

SET 
@t1 = (SELECT team_id FROM t_team_member WHERE user_id = @u1);

4):有了查询的单列赋值,我们再说下多列赋值,如果查询的返回值有多个列我们可以做如下的操纵,我们将查询出来的结果team_id和id分别赋值给t1和m1变量,

上面的单列赋值用SET,多列赋值使用的是一个SELECT…… INTO 。

SELECT team_id,id INTO
@t1,@m1
FROM t_team_member WHERE user_id = @u1;
5):说完了各种变量的赋值操作,我们还需要将结果返回,返回结果集的操作如下:SELECT @变量名  ( 变量名间用逗号分隔);

SELECT @max_effective_amount,@teamInvisitAmount

6):逻辑判断时,在存储过程中也能使用IF…… ELSE 格式为: IF(判断的条件) THEN 满足if条件做的操作 ELSE 不满足if条件做的操作 END IF;

if(@invisitAmount>@max_effective_amount) THEN
SET @invisitAmount= @max_effective_amount;
end if;

7):前面有说过一开始不确定入参和出参可以之后再编辑,编辑的参数的格式为: 【IN、OUT、INOUT】【参数名】 【参数的数据类型】,编写完成后就可以点击运行,

会弹出如下的输入参数框,如果入参有多个参数的话,可以按顺序用逗号分隔填入。



8):运行结果如下,允许有多个结果集,也就是多个SELECT 变量名 (多个变量中间用逗号分隔):

SELECT @u1,@newInvisit,@oldInvisit;









### 如何在 Navicat 中调试 MySQL 存储过程 由于 MySQL 缺乏像 Oracle 的 PL/SQL Developer 这样的专用调试工具,在 Navicat 中调试存储过程主要依赖于间接方法。一种常用的技术是在存储过程中插入 `SELECT` 语句来输出中间变量的值,以便跟踪程序流和数据状态。 #### 使用 SELECT 输出变量值 通过向存储过程中添加 `SELECT` 语句可以实时查看特定点上的变量内容。这有助于理解存储过程内部的工作机制并识别潜在错误[^3]。 ```sql CREATE PROCEDURE example_procedure() BEGIN DECLARE var INT DEFAULT 0; SET var = 1; SELECT 'Value of var after setting:', var; -- 假设这里有一些复杂的逻辑操作 SET var = var * 2; SELECT 'Value of var after doubling:', var; END // ``` #### 利用临时表记录日志 另一种方式是创建一个专门的日志表用于保存每次执行的关键信息。每当到达某个重要节点时就往该表里入一条新纪录。这种方式特别适合那些运行时间较长的任务流程监控[^2]。 ```sql -- 创建日志表格 CREATE TABLE IF NOT EXISTS debug_log ( log_id INT AUTO_INCREMENT PRIMARY KEY, message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 修改原有存储过程加入日志功能 DELIMITER $$ CREATE PROCEDURE another_example_proceudre(IN input_param VARCHAR(255)) BEGIN INSERT INTO debug_log (message) VALUES(CONCAT('Procedure started with param: ', input_param)); /* ...其他业务逻辑... */ INSERT INTO debug_log (message) VALUES('Procedure finished.'); END$$ DELIMITER ; ``` #### 手动分步验证 SQL 片段 对于较为复杂难以直接分析整个结构的情况,则可考虑将大块代码拆分成更小的部分单独测试其正确性。这样即使遇到问题也能快速定位到具体位置进行修正[^1]。 ```sql -- 单独拿出一部分查询出来看结果是否符合预期 SET @var := some_function_or_query(); SELECT @var AS result_of_the_particular_step; ``` 以上就是在 Navicat 下针对 MySQL 数据库环境内对存储过程实施有效调试的一些技巧。虽然这些手段并不如正式IDE那样直观便捷,但在实际开发维护工作中已经能够满足大部分需求了。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值