【问题标题】:PL/SQL: Error "PLS-00306: wrong number or types of arguments in call to" triggered for table of numbersPL/SQL:为数字表触发错误“PLS-00306:调用中的参数数量或类型错误”
【发布时间】:2013-10-23 13:41:25
【问题描述】:

我正在尝试使用确切的过程签名调用 API,但不知何故,我认为无法正确识别数字表。

API 定义:

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

PROCEDURE GETSERVICES_API
(
   I_DIMOBJID IN NUMBER, I_OBJECTID IN NUMBER, I_FILTER IN NUMBER, 
   O_ERRORCODE OUT NUMBER, O_ERRORTEXT OUT VARCHAR2, O_SERVICELIST OUT NUMLIST
);

我对 API 的调用:

DECLARE

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

   ls_errortext             varchar2(100);
   ln_errorcode             number;

BEGIN


    PKGCOMSUPPORT_SERVICE.GETSERVICES_API(I_DIMOBJID => 6,
                                          I_OBJECTID => 5263,
                                          I_FILTER => 3,
                                          O_ERRORCODE => ln_errorcode,
                                          O_ERRORTEXT => ls_errortext,
                                          O_SERVICELIST => lt_SERVICELIST);

END;

当我调用 API 时,我得到:PLS-00306: 调用 'GETSERVICE_API 时参数类型的数量错误

知道为什么吗?谢谢

【问题讨论】:

  • 您是否尝试将您的 NUMLIST 类型声明放在您的 pl/sql 块之外?
  • 不,我没试过,但应该是一样的。
  • 我不认为你可以在 pl/sql 块中创建类型,它们是数据库对象

标签: oracle plsql


【解决方案1】:

您遇到PLS-00306 错误的原因是包规范中定义的NUMLIST 集合类型与匿名PL/SQL 块中定义的NUMLIST 集合类型不兼容。尽管这两种集合类型的定义相同,但它们并不兼容。在您的匿名 PL/SQL 块中,您必须声明然后将 GETSERVICES_API 过程传递给 PKGCOMSUPPORT_SERVICE.NUMLIST 数据类型的变量。

create or replace package PKG as
  type t_numlist is table of number index by varchar2(50);
  procedure SomeProc(p_var in pkg.t_numlist);
end;
/

create or replace package body PKG as
  procedure someproc(p_var in pkg.t_numlist) is
  begin
    null;
  end;
end;
/

declare
  type t_numlist is table of number index by varchar2(50);
  l_var t_numlist;
begin
  pkg.someproc(l_var);
end;

ORA-06550: line 5, column 3:
PLS-00306: wrong number or types of arguments in call to 'SOMEPROC'

declare
  --type t_numlist is table of number index by varchar2(50);
  l_var pkg.t_numlist;
begin
  pkg.someproc(l_var);
end;

anonymous block completed

【讨论】:

    【解决方案2】:

    我认为类型定义无效。要创建表“类型”,您需要以下内容:

    CREATE OR REPLACE TYPE NUMLIST AS OBJECT (COLUMN1 VARCHAR2(50));
    

    【讨论】:

      【解决方案3】:

      也许你可以试试这个:

      CREATE TYPE NUMLIST AS TABLE OF NUMBER INDEX BY VARCHAR2(50);
      
      DECLARE
      
         lt_SERVICELIST              NUMLIST;
      
         ls_errortext             varchar2(100);
         ln_errorcode             number;
      
      BEGIN
      
      
          PKGCOMSUPPORT_SERVICE.GETSERVICES_API(I_DIMOBJID => 6,
                                                I_OBJECTID => 5263,
                                                I_FILTER => 3,
                                                O_ERRORCODE => ln_errorcode,
                                                O_ERRORTEXT => ls_errortext,
                                                O_SERVICELIST => lt_SERVICELIST);
      
      END;
      

      【讨论】:

        【解决方案4】:

        我也遇到了 PLS-00306 错误,但原因不同。就我而言,我使用了错误的参数名称。我有程序:FUNCTION get_card_list(p_clob_in IN CLOB, o_clob_out OUT CLOB)

        参数名称是 p_clob_ino_clob_out,所以我应该通过以下方式调用此过程:get_card_list(p_clob_in=>inner, o_clob_out=>outer)get_card_list(inner, outer),但我使用了错误的参数名称:p_xml & o_xmlget_card_list(p_xml=>inner, o_xml=>outer)

        这段 YT 视频对我帮助很大:https://www.youtube.com/watch?v=xwMVL3Z_vn8

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-09
          • 1970-01-01
          • 1970-01-01
          • 2021-07-08
          • 1970-01-01
          相关资源
          最近更新 更多