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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:07:03