PLS-00306:调用过程 PROC_T 时参数的数量或类型错误

Posted

技术标签:

【中文标题】PLS-00306:调用过程 PROC_T 时参数的数量或类型错误【英文标题】:PLS-00306: wrong number or types of arguments in call to procedure PROC_T 【发布时间】:2020-09-30 16:44:14 【问题描述】:
declare
    TYPE stag_tab IS TABLE OF d_staging%ROWTYPE;
    stag_tab1 stag_tab; 
begin
    --Bulk Collect
    select * bulk collect into staging_tab1 from d_staging; 
    PKG_T.PROC_T(stag_tab1);
end;
/

包定义:

--Package 
CREATE OR REPLACE PACKAGE PKG_T 
AS 
  TYPE staging IS TABLE OF d_staging%ROWTYPE; 
  PROCEDURE PROC_T(p_staging IN staging); 
END PKG_T; 
/

-- Package Body
CREATE OR REPLACE PACKAGE BODY PKG_T
AS
  PROCEDURE PROC_T (p_staging IN staging) 
  AS 
     VAR1 d_staging%ROWTYPE; 
     CUR1 SYS_REFCURSOR; 
     QUERY_STRING VARCHAR2(2000); 
  BEGIN 
    OPEN CUR1 FOR SELECT * from table(p_staging); 
    LOOP 
      FETCH CUR1 into VAR1; 
      EXIT WHEN cur1%NOTFOUND; 
      INSERT into d (testdata) VALUES (var1.testval1); 
      COMMIT; 
    END LOOP; 
  END; 
END PKG_T;
/

【问题讨论】:

你能把PKG_T.PROC_T的定义也放上去吗?为什么进入into staging_tab1,但声明的变量是stag_tab1 PROCEDURE PROC_T (p_staging IN staging) AS VAR1 d_staging%ROWTYPE; CUR1 SYS_REFCURSOR; QUERY_STRING VARCHAR2(2000); BEGIN OPEN CUR1 FOR SELECT * from table(p_staging);循环获取 CUR1 到 VAR1 中; cur1%NOTFOUND 时退出;插入 d (testdata) 值 (var1.testval1) ;犯罪;结束循环;结尾;结束PKG_T; / @EJEgyed 无法添加问题所以在评论中添加 我已添加到问题中,您现在可以删除评论 谢谢@Sujitmohanty30 【参考方案1】:

您收到错误是因为过程PKG_T.PROC_T 需要staging 类型的参数,但是当您调用该过程时,您传递给它的是stag_tab 类型的变量。传递给过程的变量类型需要与过程的参数定义类型相匹配。

【讨论】:

【参考方案2】:

你的程序声明:

PROCEDURE PROC_T (p_staging IN staging) 

将参数作为类型staging

您将参数作为本地定义的类型传递:

TYPE stag_tab IS TABLE OF d_staging%ROWTYPE;

这些是不同的类型。相反,您需要 PL/SQL 块:

declare
    stag_tab1 package_name.staging; 
begin
    select *
    bulk collect into stag_tab1
    from d_staging; 

    PKG_T.PROC_T(stag_tab1);
end;
/

【讨论】:

@Vikash Kumar Sharma,如果它解决了您的问题,您总是可以接受答案

以上是关于PLS-00306:调用过程 PROC_T 时参数的数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06550,PLS-00306;向 Oracle 过程插入数据时出错

PLS-00306:错误调用中的参数数量或类型错误

PLS-00306:调用“ABCINPUT”时参数的数量或类型错误

PLS-00306:调用 oracle 函数时参数的数量或类型错误

Oracle 存储过程不工作 PLS-00306

PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误