为什么在调用程序包 PROC 时出现 PLS-00306:错误的参数数量或类型错误?

Why do I get the PLS-00306: wrong number or types of arguments error when calling a Package PROC?

这是我的包体方法的顶部:

PROCEDURE GetPortfolioAppsAndProjects
(
   loginId          IN VARCHAR2 := NULL,
   portfolioId      IN NUMBER := NULL,
   portfolioType    IN VARCHAR := NULL,
   ic               IN VARCHAR := NULL,
   AppIds_CUR       IN OUT SYS_REFCURSOR
) 
IS
  INVALID_PORTFOLIO_TYPE EXCEPTION;
BEGIN

当我从 PL/SQL 执行对话执行时,这个 运行 没问题。 不过,我需要能够从 SQL 查询 window 中 运行 并加入其他表以及不开发的内容。

我正在尝试从 Sql Window:

执行此 sql
DECLARE AppIds_CUR SYS_REFCURSOR;
BEGIN
   IREPORT_PORTFOLIOS.GetPortfolioAppsAndProjects('EVANSF', null, null,    null, :AppIds_CUR);
END;

我收到这个错误:

PLS-00306: wrong number or types of arguments in call to 'GETPORTFOLIOAPPSANDPROJECTS'

我算进来5个(包括一个IN OUT游标)。 在我的通话中,我传递了 5,包括光标。 如何将游标的结果获取到输出变量 window.

AppIds_CUR 在您的区块中本地声明;您不需要通过在前面加上冒号将其视为绑定变量:

DECLARE
  AppIds_CUR SYS_REFCURSOR;
BEGIN
   IREPORT_PORTFOLIOS.GetPortfolioAppsAndProjects('EVANSF', null, null, null, AppIds_CUR);
END;

如果你 运行 你在 SQL Developer 中的声明,它会提示你输入一个绑定值,这不是你想要发生的,并将其视为varchar 不是引用游标 - 因此错误类型错误。

使用这种方法,您需要遍历光标并使用 dbms_output 手动显示它的值。但是如果你 运行 它作为脚本,你可以使用绑定变量,通过声明类型 - 这将在块之外,所以你不需要 declare:

variable AppIds_CUR REFCURSOR;

BEGIN
   IREPORT_PORTFOLIOS.GetPortfolioAppsAndProjects('EVANSF', null, null, null, :AppIds_CUR);
END;
/

print AppIds_CUR

您可以使用 SQL 开发人员 print 命令显示光标内容。