规范中声明的PL-SQL类型与正文过程的参数不兼容

时间:2017-01-12 11:20:20

标签: oracle plsql

我的包规范中定义了这种类型:

TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50);

以及规范中定义的全局变量:

G_SERVICES           NUMLIST;

我希望在我的身体中调用具有此定义的程序:

PROCEDURE filterAandB( pin_filter_type         IN NUMBER
                     , piota_initial_gservices IN OUT NUMLIST)
像这样:

filterAandB( pin_filter_type        => I_FILTER
           , pita_initial_gservices => liota_initial_gservices);

需要提及的是,该程序是私有的,因此定义在正文中

PROCEDURE filterAandB( pin_filter_type         IN NUMBER
                     , piota_initial_gservices IN OUT NUMLIST);

我正在

  

错误:PLS-00306:调用的参数的数量或类型错误   'FILTERAANDB'专线:2731

我也尝试将其称为一个块,但仍然是同样的错误。

针对类似问题,我发现您需要将参数类型声明为

pkgcomsupport_service.NUMLIST;

由于某些不兼容性,请查看this线程,所以

liota_initial_gservices pkgcomsupport_service.NUMLIST;

声明如下,并且过程声明中的参数的类型为

pkgcomsupport_service.NUMLIST;

但仍然是同样的错误。

1 个答案:

答案 0 :(得分:3)

从你所说的,我没有看到问题。但是,你的解释不是很清楚 - 如果你能够生成一个再现你所得到的错误的示例包(spec + body),那将会更有帮助。

这是我打包试图模仿你所描述的内容的一个软件包:

create or replace package test as
  TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50);
  G_SERVICES           NUMLIST;

  PROCEDURE test2(in_numlist numlist);
END TEST;
/

CREATE OR REPLACE PACKAGE BODY TEST AS
  PROCEDURE test1 (in_number NUMBER,
                   in_numlist numlist)
  IS
  BEGIN
    dbms_output.put_line('this works!');
  END;

  PROCEDURE test2(in_numlist numlist)
  IS
    v_num NUMBER := 1;
  BEGIN
    test1(v_num, in_numlist);
  END;
END TEST;
/

要调用它,我运行以下命令:

DECLARE
  v_numlist test.numlist;
BEGIN
  test.test2(v_numlist);
END;
/

这是我得到的输出:

this works!

所以,没有问题。如果上述测试用例并不能准确反映您的情况,建议您编辑问题以包含一个完整的测试用例,以便我们更好地诊断问题。