DBeaver中调用存储过程需区分场景:SQL编辑器内须手动写CALL语句并严格匹配参数类型与顺序;右键“执行存储过程”才触发交互式参数弹窗,自动处理IN/OUT/INOUT变量声明与返回展示。

CALL语句本身不支持直接在 DBeaver 的 SQL 编辑器里“交互式填参”——你得手动拼写完整调用语句,或依赖右键菜单触发参数弹窗。这是最常被误以为“不支持传参”的根源。
在 SQL 编辑器里手动写 CALL 要注意分号和参数类型
MySQL 存储过程调用必须用 CALL,且参数顺序、类型、引号必须严格匹配定义:
-
IN参数直接传值,字符串加单引号,数字不加,NULL写成NULL(不带引号) -
OUT或INOUT参数不能传字面量,必须用用户变量(如@out_result),否则报错Incorrect number of arguments - 如果存储过程定义用了
DELIMITER $$,调用时仍用分号结尾,别混进$$ - 示例:
CALL my_proc(123, 'hello', @out_val);—— 第三个是OUT参数,必须提前声明变量或接受返回
右键“执行存储过程”才是真·参数交互入口
DBeaver 只有通过数据库导航树中右键已存在的存储过程 → 执行存储过程,才会弹出带类型提示的参数输入框。这个界面会自动识别 IN/OUT/INOUT 并做基础校验。
- 对
IN参数:输入框可直接填值,支持NULL字面量(勾选 “NULL” 复选框) - 对
OUT参数:输入框置灰,但会显示执行后赋值的变量名(如@_out_param_1),结果集下方会额外列出这些变量值 - 若过程有默认值(如
IN p_name VARCHAR(50) DEFAULT 'anon'),对应输入框会预填,默认值不为空时可留空直接执行 - 不推荐在该界面传超长文本或二进制数据,容易触发 UI 截断;大字段建议改用
CALL手动构造
OUT 和 INOUT 参数必须显式声明用户变量
即使你用右键执行,DBeaver 底层仍是生成并执行一组语句:先 SET @var = ...,再 CALL proc(...),最后 SELECT @var。但如果你跳过右键、直接在 SQL 编辑器里写 CALL,就必须自己管理变量生命周期。
- 必须在
CALL前用SET @out_x = NULL;初始化,否则OUT参数可能为NULL但你不自知 - 执行完后,要主动查变量:
SELECT @out_x;,DBeaver 不会自动展示——这点极易忽略 - 多个
OUT参数不要共用变量名,否则后赋值覆盖前值 - MySQL 8.0+ 支持
SELECT直接返回多值,但 DBeaver 的右键执行仍走传统变量路径,兼容性更稳
Oracle 和 MySQL 的参数处理逻辑完全不同
别套用 MySQL 经验去操作 Oracle 存储过程。Oracle 的 CALL 不支持用户变量,OUT 参数必须用匿名块(BEGIN ... END;)包装,且需指定类型精度。
- Oracle 正确写法不是
CALL proc(?, ?),而是:BEGIN proc(:in_param, :out_param); END;
- DBeaver 对 Oracle 的右键执行会自动生成完整匿名块,并把
:out_param映射为绑定变量,你只需在弹窗填值 - Oracle 参数名区分大小写(取决于创建时是否加双引号),而 MySQL 参数名不区分——传参时大小写写错,Oracle 会直接报
PLS-00306 - Oracle 的
DATE、NUMBER(10,2)等类型精度必须与过程定义一致,DBeaver 输入框不校验精度,填错只在执行时报错
右键执行看似简单,但背后变量生命周期、类型精度、方言差异全藏在细节里。真正卡住人的,往往不是“怎么点”,而是“点了之后变量哪去了”“为什么 OUT 没返回”“Oracle 为啥死活不认参数名”。











