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:调用“ABCINPUT”时参数的数量或类型错误