一、存储过程参数定义与调用的核心规则 1. IN参数:调用时可直接传递值或变量,无需显式指定`IN`,但需确保参数顺序/名称匹配。 2. OUT参数:必须传递已声明的变量(不能直接传值),且调用时需显式标注`OUT`(如`p_out_param OUT`)。 3. IN OUT参数:需传递可读写的变量,调用时可标注`IN OUT`或仅`OUT`(部分客户端支持简写)。
二、常见错误场景与解决方法 1. 未处理OUT/IN OUT参数 • 错误示例:调用带OUT参数的存储过程时直接传值(如`EXEC proc_test(123, 'value');`)。 • 解决方法: ① 先声明变量(如`DECLARE v_out VARCHAR2(20);`); ② 调用时指定OUT参数(如`EXEC proc_test(123, v_out OUT);`); ③ 执行后通过`DBMS_OUTPUT.PUT_LINE(v_out);`查看输出。
2. 参数顺序或名称不匹配 • 错误示例:存储过程定义为`PROCEDURE proc_test(p_id IN NUMBER, p_name OUT VARCHAR2)`,调用时参数顺序颠倒。 • 解决方法: ① 严格按定义顺序传递参数; ② 或使用命名参数法(如`EXEC proc_test(p_id => 123, p_name => v_out OUT);`),避免顺序错误。
3. 未启用输出变量查看 • 错误示例:DBeaver中执行后看不到OUT参数值,误以为参数丢失。 • 解决方法: ① 确保DBeaver的“输出”面板已开启(菜单:窗口→显示视图→其他→通用→输出); ② 执行后在输出面板查看`DBMS_OUTPUT`的打印内容。
4. 权限不足或存储过程编译错误 • 错误示例:存储过程未编译通过(如参数类型不匹配),或调用者无执行权限。 • 解决方法: ① 检查存储过程编译状态(DBeaver中展开“过程”节点,查看是否有红色叉号); ② 确认调用用户有`EXECUTE`权限(如`GRANT EXECUTE ON proc_test TO username;`)。