PL/SQL调用DAYS遇ORA-06550/PLS-00306参数错误的原因排查
错误原因分析与修正方案
这个ORA-06550/PLS-00306错误的核心问题是集合元素的类型不匹配,具体拆解来看:
- 你定义的
days是TABLE OF lyrics类型,意味着这个集合里的每一个元素都必须是lyrics对象的实例,而不是普通的字符串。 lyrics作为自定义对象类型,包含date_name和gift_name两个属性。要创建它的实例,必须调用对象构造函数lyrics(<date_name值>, <gift_name值>),传入对应数量和类型的参数。- 你现在直接用
days('first', 'second', ...)初始化集合,相当于试图用一堆VARCHAR2字符串去构造days集合,但PL/SQL期望的是一个个lyrics对象实例,自然会触发"参数数量/类型不匹配"的错误。
修正后的代码示例
CREATE OR REPLACE TYPE lyrics IS OBJECT ( date_name VARCHAR2(8), gift_name VARCHAR2(24) ); / DECLARE TYPE days IS TABLE OF lyrics; TYPE gifts IS TABLE OF lyrics; -- 每个元素都通过lyrics构造函数创建,传入对应的两个属性值 lv_dates DAYS := days( lyrics('first', 'partridge'), lyrics('second', 'turtle doves'), lyrics('third', 'French hens'), lyrics('fourth', 'calling birds'), lyrics('fifth', 'golden rings'), lyrics('sixth', 'geese a-laying'), lyrics('seventh', 'swans a-swimming'), lyrics('eighth', 'maids a-milking'), lyrics('ninth', 'ladies dancing'), lyrics('tenth', 'lords a-leaping'), lyrics('eleventh', 'pipers piping'), lyrics('twelth', 'drummers drumming') ); BEGIN -- 可选:验证集合内容 FOR idx IN lv_dates.FIRST .. lv_dates.LAST LOOP DBMS_OUTPUT.PUT_LINE( 'Day ' || lv_dates(idx).date_name || ': ' || lv_dates(idx).gift_name ); END LOOP; END; /
如果某些gift_name暂时没有值,你可以传入NULL来占位,比如lyrics('first', NULL),这样也完全符合对象构造函数的参数要求。
内容的提问来源于stack exchange,提问作者ish T.
相关产品推荐
相关产品推荐

