调用我的程序时参数的数量或类型错误
Posted
技术标签:
【中文标题】调用我的程序时参数的数量或类型错误【英文标题】:wrong number or types of arguments in call to my procedure 【发布时间】:2013-05-24 14:17:56 【问题描述】:您好,我编写此代码是为了创建一个基于 if 条件返回布尔值的过程,但是当我执行它时出现此错误:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'DDPAY_SP'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
这是我的程序
create or replace procedure DDPAY_SP (
donor_id dd_donor.iddonor%type,
pldgstatus out dd_pledge.idstatus%type,
monthplan out dd_pledge.paymonths%type,
ret out boolean)
IS
begin
select idstatus, paymonths into
pldgstatus, monthplan from dd_pledge
where iddonor = donor_id ;
if (pldgstatus = 10 AND monthplan >0)
then ret:= true;
else
ret:= false;
end if;
end;
这就是我执行它的方式
EXECUTE DDPAY_SP (308);
我没有多说,希望对你来说足够清楚
我在线阅读它建议我检查命名以及我所做的数据类型,但没有任何改变
任何想法
【问题讨论】:
您的过程需要 1 个输入值和三个输出变量。您只提供了输入值。 @BobJarvis 但是我为什么要提供输出......顺便说一句,问题只是要求一个布尔值(真/假)而不是两个变量,但我在此之前声明了它们,因为我得到了错误我想那是因为他们不在,所以我只是宣布了他们。运行 SQL 语句,但我不需要输出它们 那我怎么写我的执行语句 【参考方案1】:如果您不需要第二个和第三个参数,您可以在过程中将它们声明为变量而不是参数,如下所示:
CREATE OR REPLACE PROCEDURE DDPAY_SP(DONOR_ID IN DD_DONOR.IDDONOR%TYPE,
RET OUT BOOLEAN)
IS
nPayment_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO nPayment_count
FROM DD_PLEDGE p
WHERE p.IDDONOR = DONOR_ID AND
p.IDSTATUS = 10 AND
p.PAYMONTHS > 0;
IF nPayment_count > 0 THEN
RET := TRUE;
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('DD_PAY - exception: ' || SQLCODE || ' : ' || SQLERRM);
RAISE;
END DDPAY_SP;
我在 DD_PAY 的末尾包含了一个 EXCEPTION 处理程序的示例。至少包含这个最小的处理程序总是一个好主意,这样一旦发生异常,您就会得到问题所在的一些指示。
因为此过程返回一个 BOOLEAN 值,并且 BOOLEAN 不能(据我所知)在 SQL*Plus 中使用,您必须从 PL/SQL 块调用它,如下所示:
DECLARE
bRetval BOOLEAN;
BEGIN
DD_PAY(308, bRetval);
DBMS_OUTPUT.PUT_LINE('Returned value is ' ||
CASE bRetval
WHEN TRUE THEN 'TRUE'
ELSE 'FALSE'
END);
END;
试试看。
编辑:根据后来 cmets 提供的更多信息重写了程序。
分享和享受。
【讨论】:
我得到这个家伙 ORA-01422:精确提取返回的行数超过了请求的行数 ORA-06512:在“SYSTEM.DDPAY_SP”,第 20 行 ORA-06512:在第 4 行 01422。 00000 - “精确提取返回的行数多于请求的行数” *原因:精确提取中指定的数量小于返回的行数。 *操作:重写查询或更改请求的行数 我再次对其进行了测试,但使用了不同的 id_donnor 值,我发现如果该值在 dd_pledge 中只有一行,它只会给我“匿名块已完成”,既不是真也不是假.....但是如果该值超过一行,则发生错误???? 对不起,DBMS 输出窗口没有连接到我的架构,因此我看不到输出.....但是如果 iddonnor 有超过一行,我仍然会得到“精确提取返回的行数超过了请求的行数” @user2396035 :问题是对于给定的 IDDONOR,DD_PLEDGE 中存在不止一行,这是我无法知道的。没问题 - 我已经重写了处理这种情况的程序。分享和享受。 我对其进行了测试,它现在看起来很好......但是当我使用 idstatus =20 和 paymonths=0 的不同行进行测试时,我发现令人惊讶的一件事它给了我 FALSE “这是我所期望的”所有案例都希望有一个案例它给了我 TRUE!!!!以上是关于调用我的程序时参数的数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00306:调用“ABCINPUT”时参数的数量或类型错误
ORA-06550: 调用 'CHECK_INFO_INS' 的参数数量或类型错误