为什么我在调用Package PROC时得到PLS-00306:错误的参数数量或类型错误?

时间:2015-09-03 16:33:25

标签: oracle plsql oracle-sqldeveloper sys-refcursor

以下是我的Package Body方法的顶部部分:

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查询窗口运行它并加入其他表以及不开发的内容。

我试图从Sql窗口执行这个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。 如何将光标结果输出到输出变量窗口。

1 个答案:

答案 0 :(得分:1)

AppIds_CUR在您的区块中本地声明;你不需要通过在冒号之前将它作为绑定变量来对待它:

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

如果你在SQL Developer中运行你所拥有的语句,它会提示你输入一个绑定值,这不是你想要发生的事情,并将它视为varchar而不是ref游标 - 因此错误类型的错误。

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

variable AppIds_CUR REFCURSOR;

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

print AppIds_CUR

您可以使用SQL Developer print命令显示游标内容。