如何测试带varray入参的PL/SQL存储过程及排查exec执行报错
自定义VARRAY入参PL/SQL存储过程测试指南
原exec语句报错的核心原因
- 你的存储过程签名定义的是单入参为
pe_varray自定义数组类型,不支持拆分数组元素作为独立参数传入。之前写的exec event_attendees(3,9)本质是给过程传递2个独立的数值参数,和过程要求的“1个VARRAY类型参数”的签名完全不匹配,语法解析阶段就会直接抛出参数数量、类型不匹配的错误。 - 所有调用逻辑的本质:不管传多少个pid,都必须先把这些值打包成
pe_varray类型的实例,作为唯一的入参传给过程,不能拆成独立参数传。
基础调用语法
调用时需要直接使用VARRAY类型的内置构造函数,把要传的数值作为参数传给pe_varray,格式为:
-- 构造的数组第一个元素传eid,后续元素依次传pid exec event_attendees(pe_varray(eid值, pid1值, pid2值, ... ));
只要构造的数组长度≥2(满足至少1个eid+1个pid的要求)、元素类型为数值,就能正常传入过程。
全分支覆盖测试用例
对应过程内的所有if/else判断逻辑,可按以下场景逐一测试:
- eid无效场景:传入的eid不存在于event表
预期触发最外层判断,输出-- 替换成实际不存在的eid值,比如示例中的99999 exec event_attendees(pe_varray(99999, 1001));Event does not exist,不会进入后续的pid循环逻辑。 - pid无效场景:传入的eid有效,但列表中至少有一个pid不存在于people表
预期针对无效pid输出-- eid换成实际存在的值(比如3),列表中放一个不存在的pid(比如88888) exec event_attendees(pe_varray(3, 88888, 1001));Person does not exist,跳过该无效pid的后续关联校验、插入逻辑。 - 关联组合已存在场景:传入的eid、pid有效,且这对组合已经存在于Person_Event关联表中
预期触发存在性判断,输出-- 替换成实际已经存在的关联对,比如eid=3、pid=9 exec event_attendees(pe_varray(3, 9));No need to insert,不会执行重复插入。 - 正常可执行无报错场景:传入的eid有效、所有pid有效,且所有关联组合均未在业务表中存储
预期针对每个可插入的有效pid,输出-- 传入有效eid、有效pid,确保关联对不存在 exec event_attendees(pe_varray(3, 1002, 1003));Attendee(s) for event with id 3 added,正常完成插入操作。
复杂场景测试补充
如果需要动态构造数组、或者传参逻辑比较复杂,可通过匿名PL/SQL块完成调用,不用硬写在exec语句里:
set serveroutput on; declare -- 初始化空的VARRAY实例 test_combo pe_varray := pe_varray(); begin -- 按需扩展数组长度,最多支持10个元素(和VARRAY定义的上限一致) test_combo.extend(3); -- 给数组元素赋值 test_combo(1) := 3; -- 第一位固定放eid test_combo(2) := 1004; -- 后续依次放pid test_combo(3) := 1005; -- 直接传入实例调用过程 event_attendees(test_combo); end; /
内容的提问来源于stack exchange,提问作者soonhee
相关产品推荐
相关产品推荐

