如何在SQL Developer中执行带自定义类型的Oracle存储过程
解决Oracle存储过程调用错误的方案
核心问题分析
你遇到的报错都是因为变量类型不匹配、PL/SQL语法错误导致的,具体问题包括:
- 未正确引用包内定义的关联数组类型
t_id_values,反而使用了无效的TABLE类型或自行重复定义类型 - 误用SQL*Plus的
var命令在PL/SQL块内声明变量(var是外部命令,不能放在DECLARE段) - 将
PRINT命令放在PL/SQL块内部(PRINT是外部命令,需与块用/分隔) - 笔误调用了不存在的
GET_COOP过程(应为GET_STUFF) - 直接向关联数组类型参数传
null(关联数组变量需先声明,即使是空的)
正确的调用代码
存储过程中的t_id_values是INDEX BY类型的关联数组,调用时必须直接使用包内定义的类型,不能自行定义或用普通TABLE替代。以下是可正常执行的代码:
DECLARE v_id NUMBER := 2; -- 直接使用包中定义的关联数组类型 v_item_ids PKG_REPORTS.t_id_values; v_items SYS_REFCURSOR; BEGIN -- 可选:如果需要传递具体的ID值,给关联数组赋值 -- v_item_ids(1) := 101; -- v_item_ids(2) := 102; -- 调用存储过程,传入对应类型的变量 PKG_REPORTS.GET_STUFF( p_ID => v_id, p_ItemIDs => v_item_ids, p_items => v_items ); END; / -- PRINT是SQL Developer/SQL*Plus的外部命令,需放在PL/SQL块之后 PRINT v_items;
关键注意事项
- 关联数组(INDEX BY类型)无需用构造函数初始化,声明后默认就是空集合,可以直接传入
- 必须使用
PKG_REPORTS.t_id_values声明变量,不能自行定义同名类型(会导致类型不匹配) PRINT命令不能放在PL/SQL块内部,块执行完成后用/分隔再执行PRINT- 若需传递空的关联数组,直接声明变量不赋值即可,无需赋值
null
内容的提问来源于stack exchange,提问作者HisDivineShadow
相关产品推荐
相关产品推荐

