Oracle存储过程调用O_ITEM_TKT_REC_TAB报PLS-00306错误求助
问题排查与修复方案
错误根因
- 类型匹配错误:
O_item_tkt_rec_tab是O_item_tkt_tab对象的集合类型,它的构造函数只能接收O_item_tkt_tab实例作为参数,你直接将对象的三个属性值传入集合构造函数,参数类型/数量不匹配,因此触发PLS-00306报错。 - 集合赋值逻辑错误:循环中直接给
Out_Item_tab整体赋值,会覆盖上一轮循环的结果,最终只会保留最后一条处理结果,不符合批量处理的预期。
修复后的完整存储过程代码
CREATE OR REPLACE PROCEDURE item_tkt_tab( In_Item_tab IN I_item_tkt_rec_tab , Out_Item_tab OUT O_item_tkt_rec_tab ) IS L_Tkt_stat NUMBER; -- 调整为数字类型匹配游标查询结果 L_Item varchar2(25); L_ticket_type_id varchar2(4); CURSOR c_get_tkt_tab(L_Item varchar2,L_ticket_type_id varchar2) IS SELECT 1 from item_ticket where item =L_Item and ticket_type_id = L_ticket_type_id; BEGIN -- 初始化空集合 Out_Item_tab := O_item_tkt_rec_tab(); FOR i IN 1 .. In_Item_tab.COUNT LOOP open c_get_tkt_tab(In_Item_tab(i).Item,In_Item_tab(i).ticket_type_id); FETCH c_get_tkt_tab into L_Tkt_stat; CLOSE c_get_tkt_tab; -- 集合扩容1位 Out_Item_tab.EXTEND; if L_Tkt_stat is not null then -- 给集合最后一位赋值对象实例 Out_Item_tab(Out_Item_tab.LAST) := O_item_tkt_tab(In_Item_tab(i).item,In_Item_tab(i).ticket_type_id,'XItemTicketCre') ; else Out_Item_tab(Out_Item_tab.LAST) := O_item_tkt_tab(In_Item_tab(i).item,In_Item_tab(i).ticket_type_id,'XItemTicketMod') ; end if; END LOOP; EXCEPTION WHEN OTHERS THEN Out_Item_tab := NULL; END; /
内容的提问来源于stack exchange,提问作者praveen
相关产品推荐
相关产品推荐

