SQL 存储过程编译错误:调用中的参数数量或类型错误
Posted
技术标签:
【中文标题】SQL 存储过程编译错误:调用中的参数数量或类型错误【英文标题】:SQL stored procedure compile error: wrong number or types of arguments in call 【发布时间】:2011-06-13 15:52:59 【问题描述】:我已经创建了这个存储过程。但是我收到此错误
ORA-06550:第 14 行第 3 列:PLS-00306: 中的参数数量或类型错误 调用“CHALLENGEUPDATE”时 传递的值是 CUSTID :='400800500' ;政策名称:= '政策';挑战者:= '挑战者1';定位:= 'PINPOS';
代码是:
create or replace
procedure ChallengeUpdate
(
CustID IN SEC_CHALLENGE.CUSTOMERID%TYPE,
PolicyName IN SEC_CHALLENGE.POLICY_NAME%TYPE,
ChallengeId IN SEC_CHALLENGE.CHALLENGE_ID%TYPE,
PinPositions IN SEC_CHALLENGE.PINPOSITIONS%TYPE,
o_result OUT INTEGER,
o_code OUT INTEGER,
o_c OUT INTEGER
)
as
c integer;
begin
select count(*) into c from SEC_CHALLENGE xyz where xyz.CUSTOMERID=CustID and
xyz.POLICY_NAME=PolicyName;
if c = 0 then
INSERT INTO SEC_CHALLENGE(CUSTOMERID,CHALLENGE_ID,PINPOSITIONS,POLICY_NAME)
VALUES (CustID,ChallengeId, PinPositions, PolicyName);
else
UPDATE RBSSEC_CHALLENGE
SET CHALLENGE_ID=ChallengeId, PINPOSITIONS=PinPositions
WHERE CUSTOMERID=CustID and POLICY_NAME = PolicyName;
end if;
commit;
o_result:=0;
o_c:=c;
exception when others then
o_result:=-1;
o_c:=c;
rollback;
o_code :=SQLCODE;
end ChallengeUpdate;
SEC_CHALLENGE 表是这样的
CREATE TABLE "MUJEEB"."RBSSEC_CHALLENGE"
(
"CUSTOMERID" VARCHAR2(9 BYTE) NOT NULL ENABLE,
"CHALLENGE_ID" VARCHAR2(50 BYTE),
"PINPOSITIONS" VARCHAR2(20 BYTE) NOT NULL ENABLE,
"POLICY_NAME" VARCHAR2(50 BYTE) NOT NULL ENABLE,
CONSTRAINT "RBSSEC_CHALLENGE1_PK" PRIMARY KEY ("CHALLENGE_ID")
)
这是我的运行方式:
DECLARE CUSTID VARCHAR2(9);
POLICYNAME VARCHAR2(50);
CHALLENGEID VARCHAR2(50);
PINPOSITIONS VARCHAR2(20);
O_RESULT NUMBER;
O_CODE NUMBER;
BEGIN CUSTID :='400800500' ;
POLICYNAME := 'POLICY';
CHALLENGEID := 'CHALLENGEID1';
PINPOSITIONS := 'PINPOS';
CHALLENGEUPDATE( CUSTID => CUSTID, POLICYNAME => POLICYNAME, CHALLENGEID => CHALLENGEID, PINPOSITIONS => PINPOSITIONS, O_RESULT => O_RESULT, O_CODE => O_CODE );
DBMS_OUTPUT.PUT_LINE('O_RESULT = ' || O_RESULT);
DBMS_OUTPUT.PUT_LINE('O_CODE = ' || O_CODE);
END;
【问题讨论】:
请在这里找到问题 请说明你是怎么称呼它的。您是否为 OUT 参数传递了变量? call ChallengeUpdate(?,?,?,?) 这是错误的,你需要传递所有的参数,即使是out参数,你也少了3个“?” 【参考方案1】:如果使用带有“out”关键字标记的输出参数,则必须为该参数传递一个变量。输出参数不是可选的。从错误中,我推测您还没有这样做。
【讨论】:
这是我运行它的方式 DECLARE CUSTID VARCHAR2(9);政策名称 VARCHAR2(50);挑战 VARCHAR2(50);定位 VARCHAR2(20); O_RESULT 号码; O_CODE NUMBER; BEGIN CUSTID :='400800500' ;政策名称 := '政策';挑战 := '挑战 1'; PINPOSITIONS := 'PINPOS'; CHALLENGEUPDATE(CUSTID => CUSTID, POLICYNAME => POLICYNAME, CHALLENGEID => CHALLENGEID, PINPOSITIONS => PINPOSITIONS, O_RESULT => O_RESULT, O_CODE => O_CODE); DBMS_OUTPUT.PUT_LINE('O_RESULT = ' || O_RESULT); DBMS_OUTPUT.PUT_LINE('O_CODE = ' || O_CODE);结束; 你没有提供 O_C => O_C【参考方案2】:如果你使用 toad,试试这个方法:
var o_result integer;
var ocode integer;
var oc integer;
exec ChallengeUpdate ('400800500', 'POLICY', 'CHALLENGEID1', 'PINPOS', :o_result, :ocode, :oc );
print o_result;
print ocode ;
print oc;
【讨论】:
【参考方案3】:来自声明:
procedure ChallengeUpdate
(
CustID IN SEC_CHALLENGE.CUSTOMERID%TYPE,
PolicyName IN SEC_CHALLENGE.POLICY_NAME%TYPE,
ChallengeId IN SEC_CHALLENGE.CHALLENGE_ID%TYPE,
PinPositions IN SEC_CHALLENGE.PINPOSITIONS%TYPE,
o_result OUT INTEGER,
o_code OUT INTEGER,
o_c OUT INTEGER
) as
您对CHALLENGEUPDATE
的调用碰巧错过了o_c OUT INTEGER
的输出变量。你可以试试下面的:
exec CHALLENGEUPDATE(
CUSTID => CUSTID
, POLICYNAME => POLICYNAME
, CHALLENGEID => CHALLENGEID
, PINPOSITIONS => PINPOSITIONS
, O_RESULT => O_RESULT
, O_CODE => O_CODE
, O_C => O_C_tobedeclared);
【讨论】:
以上是关于SQL 存储过程编译错误:调用中的参数数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Data Jpa 在 Oracle 中调用存储过程时参数的数量或类型错误
PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误