You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:10:27